如何使用accepts_nested_attributes_for使simple_form做我想做的事

时间:2013-03-08 09:33:55

标签: ruby-on-rails activerecord simple-form

每个survey has_many resultsaccepts_nested_attributes_for results

/app/models/survey.rb:

attr_accessible :results_attributes
has_many :results
accepts_nested_attributes_for :results

选择或不选择每个结果:

/db/schema.rb:

create_table "results", :force => true do |t|
  t.boolean  "selected", :default => false
  t.integer "survey_id"
end

有时@survey.additive == true。在这些情况下,可以选择任意数量的结果。您可以使用一系列复选框来表示此问题,result中每个@survey.results都有一个复选框。

有时@survey.additive == false。在这些情况下,只能选择一个结果。您可以通过一系列单选按钮来表示这一点,result中的每个@survey.results都有一个。

我正在使用simple_form和HAML。

我尝试编写/app/views/surveys/_form.html.haml,以便创建一系列单选按钮,以选择@survey.additive == false时选择的结果。

(从那里应该很容易推断代码,以便在@survey.additive == true时创建一系列复选框。)

我的第一次尝试是:

= simple_form_for [@competitor, @survey] do |f|
  = f.error_notification
  = f.simple_fields_for :results do |r|
    = r.input :selected, :as => :radio_buttons, :label => r.name
  = f.button :submit, :id => 'submit_survey'

这给我带来了undefined method 'name' for #<SimpleForm::FormBuilder:0x007fbd1f687048>错误。

我的第二步是移除:label => r.name,但结果是四行单独的单选按钮,每行标有&#34; Selected&#34;每个包含&#34;是&#34;单选按钮和&#34;否&#34;单选按钮。通过单独我的意思是在一行中选择是取消选择该行中的否但对其他行中的单选按钮没有影响。 (我实际需要的是四个连接的单选按钮,每个按钮在result.name中用@survey.results标记,以便取消选择其中任何一个将取消选择其他三个。)

之后,我尝试了很多变化,但到目前为止我的所有尝试都失败了。我该怎么办?

1 个答案:

答案 0 :(得分:0)

使用underfined method 'name'可以克服r.object.name错误。

如果在selected设置为true的情况下可以得到很多结果,这就足够了,它应该适用于上述情况。如果没有,请继续阅读。

布尔值上的radio_buttons是它们将生成yesno选项。如果您只想要一个选定的结果,我建议您切换到调查has_many :resultsbelongs_to :selected_result的情况。然后,您将能够构建一组单选按钮,用于设置selected_result_id生成的survey.results

如果这不是一个选项,则必须使用自定义验证验证Survey,以便它只能有一个selected_result(为其添加范围)并构建一组从survey.results生成的单选按钮attr_accessor :selected_result_id。然后,在您的控制器中,您必须遍历结果并在除选定结果之外的每个结果上设置result.selected = false