我在Ruby on Rails应用程序(4.0.2)中使用嵌套属性,以便调查has_many问题并接受_nested_attributes_for问题和问题belongs_to survey。
我遇到的问题是,当我只想查看属于特定调查的问题时,我会得到一个未定义的方法" id"为nil:NilClass" -error。另一方面,当我查看索引操作无问题的所有问题时。
我的问题控制器索引操作:
def index
@questions = Question.where(:survey_id => @survey.id).all # if instead I use @questions = Question.all it works fine, but is not what I want.
#@questions = @survey.questions.all
@surveys = Survey.all
@survey = Survey.first
end
我的survey / index.html.erb页面:
<%= link_to("questions", { :controller => 'questions', :survey_id => survey.id }, :class => 'btn btn-xs') do %>
<%= glyph 'th-list' %>
<%- end -%>
我的问题模型:
class Question < ActiveRecord::Base
belongs_to :survey
scope :sorted, lambda { order("questions.created_at ASC")}
end
我还使用了一个我称之为find_survey的before_action,如下所示:
def find_survey
# If in each action calling this method (find_survey) has :survey_id sent
if params[:survey_id]
# We will then go to the database and look for (and find) :survey_id and set that to @survey.
@survey = Survey.find(params[:survey_id])
end
end
有人能指出我正确的方向吗?
答案 0 :(得分:1)
NilClass
上的未定义方法是因为您的实例变量@survey
为零,当您调用Question.where(:survey_id => @survey.id).all
时,您会收到该错误。
如果您的关联设置正确,您应该能够@survey.questions
运行,而不必在Questions
上执行搜索。这部分是ActiveRecord rails magic。你应该打电话给@survey.questions.all
,因为这会返回问题课的所有内容,不管怎样,你应该好好去。
至于为什么现在这不适合你,它可能只是一个订单 - 你在下面这一行定义之前调用了@survey
。
答案 1 :(得分:0)
根据您发布的错误,此行中的@survey
可能为nil
:
@questions = Question.where(:survey_id => @survey.id).all
所以也许你的&#34; before_action&#34;没被叫?