Ruby On Rails Helpers -- 在helpers中使用实例变量

10

我有一个控制器的辅助程序:

module CourseStepsHelper
  def current_quiz_result
    @course_step.step.step_quiz.quiz_attempts.where(:patient_id => current_user.id, :step_quiz_id => @course_step.step.step_quiz.id).first
  end
end

它可以访问@course_step变量,该变量在CourseSteps控制器的show“动作”中被定义。在helpers中使用实例变量是一种常见实践吗?


请尽量清晰地表达您的问题。 - polarblau
@polarblau 我已经搞清楚我的问题了。 - Chris Muench
请看实际答案:https://dev59.com/p2w15IYBdhLWcg3wpNcB(注意,这是翻译,而不是原本的回答) - jibiel
2个回答

1

根据此测验结果的详细程度,您可能需要使用部分。在这种情况下,语法将是:

<%= render :partial => 'quiz/results', :locals => { :quiz => @quiz } %>

如果它相对简单,而且你认为它应该在帮助程序中,那么你应该将quiz作为参数。要求视图提供特定的实例变量来使用你的帮助程序可能会被其他开发人员所反感。
def quiz_result(quiz)    # no need to call it "current" when we supply quiz
    # do some stuff
end

我觉得你可能需要以某种方式重新构建你的模型。正如你所看到的,我用一个Quiz类来实现我的例子。我不确定你的数据模型是什么样子的,但当你调用嵌套那么深的属性时,通常意味着有些问题。


6
好的,但是这并没有真正回答原始问题。在我看来,问题是"使用/假设实例变量还是将其作为参数传递"。例如,助手是否按原样调用,假设@course_step变量存在?或者你应该像这样调用辅助函数:current_quiz_result(@course_step),函数应该接受一个参数吗? - ybakos
请参见实际答案:https://dev59.com/p2w15IYBdhLWcg3wpNcB 。谢谢,@ybakos! - jibiel

1

我还没有看到任何一个好的论点支持其中任何一种情况,并且当我在寻找答案时偶然发现了这个问题。就个人而言,在助手方法中尽可能使用实例变量是最干净的方法,因为它适用于助手和视图。与从我的视图传递实例变量并定义我的助手方法来接受它相比,我可以直接在助手中使用它。无论如何,打字稍微少一些...


1
通过使用实例变量。您的帮助程序可以访问与您的视图相同的实例变量。 - Derek Prior

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接