Rails after_initialize

时间:2013-12-12 19:17:24

标签: ruby-on-rails activerecord

我有以下课程:

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['','','','']。我错了吗?

2 个答案:

答案 0 :(得分:2)

你很亲密。设置属性时名称不够。使用self.的前缀使其正常工作:

self.choices ||= ['','','','']

仅使用choices创建该名称的局部变量,而不是设置属性。

答案 1 :(得分:1)

after_initialize中的以下代码正在更新choices局部变量,这不是您想要的:

choices ||= ['','','','']

您需要使用

self.choices || = ['','','','']

Why do Ruby setters need "self." qualification within the class?

中讨论过