我有以下课程:
class Question < ActiveRecord::Base
serialize :choices
attr_accessible :content, :choices, :answer_id
after_initialize :after_initialize
private
def after_initialize
choices ||= ['','','','']
end
end
目的是每个问题有4个可能的答案选择,我希望问题对象始终具有初始化的选项,即使它们是空白的。它们永远不应该保存到数据库空白,但这是一个单独的问题。总之...
在我的问题表格中,我重复了选择:
<% @question.choices.each_with_index do |value, key| %>
<tr>
<td>
<%= f.radio_button :answer_id, key %>
</td>
<td>
<input name="question[choices][]" type="text" value="<%= value %>" />
</td>
</tr>
<% end %>
这应该给用户4个输入来输入答案选择文本和单选按钮以选择哪个是正确的。当我加载表单以创建新问题时,我收到此错误:
undefined method `each_with_index' for nil:NilClass
基本上,:choices
属性未正确初始化。确实,检查@question
给了我这个:
#<Question id: nil, content: nil, choices: nil, answer_id: nil, created_at: nil, updated_at: nil>
我希望其他所有内容都是零,但我希望:choices
为['','','','']
。我错了吗?
答案 0 :(得分:2)
你很亲密。设置属性时名称不够。使用self.
的前缀使其正常工作:
self.choices ||= ['','','','']
仅使用choices
创建该名称的局部变量,而不是设置属性。
答案 1 :(得分:1)
after_initialize
中的以下代码正在更新choices
局部变量,这不是您想要的:
choices ||= ['','','','']
您需要使用
self.choices || = ['','','','']
在Why do Ruby setters need "self." qualification within the class?
中讨论过