2011-03-11 124 views
10

我有个帮手控制器:Ruby on Rails的助手 - 在助手使用实例变量

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 

它可以访问其在CourseSteps控制器秀“行动”定义@course_step。这是在助手中使用实例变量的常见做法吗?

+0

请尝试更清楚地说明你的问题。 – polarblau 2011-03-11 15:57:06

+0

@polarblau我已经清理了我的问题 – 2011-03-11 16:38:43

+0

实际的答案请参阅http://stackoverflow.com/questions/6474596/should-rails-helpers-assume-an-instance-variable-exists-or-should-they-receive -t – jibiel 2012-06-27 07:12:04

回答

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 2011-06-24 22:47:17

+0

对于实际的答案,请参阅http://stackoverflow.com/questions/6474596/should-rails-helpers-assume-an-instance-variable-exists-or-should-they-receive-t谢谢@ybakos! – jibiel 2012-06-27 07:14:37

1

我还没有看到针对这两种情况提出的良好论点,并且在寻找答案时偶然发现了这个问题。就我个人而言,我一直在助手方法中使用实例变量,因为这是辅助方法和视图中最干燥的方法。我可以直接在助手中直接使用它,而不是从我的视图中传递实例变量并定义我的帮助器方法来接受它。无论如何,打字略少...

+0

...你怎么做? – 2012-12-07 17:17:55

+1

...通过使用实例变量。您的帮助程序可以访问您的视图所使用的相同实例变量。 – 2012-12-12 20:24:00