每个survey
has_many
results
和accepts_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
标记,以便取消选择其中任何一个将取消选择其他三个。)
之后,我尝试了很多变化,但到目前为止我的所有尝试都失败了。我该怎么办?
答案 0 :(得分:0)
使用underfined method 'name'
可以克服r.object.name
错误。
如果在selected
设置为true的情况下可以得到很多结果,这就足够了,它应该适用于上述情况。如果没有,请继续阅读。
布尔值上的radio_buttons是它们将生成yes
和no
选项。如果您只想要一个选定的结果,我建议您切换到调查has_many :results
和belongs_to :selected_result
的情况。然后,您将能够构建一组单选按钮,用于设置selected_result_id
生成的survey.results
。
如果这不是一个选项,则必须使用自定义验证验证Survey,以便它只能有一个selected_result(为其添加范围)并构建一组从survey.results
生成的单选按钮attr_accessor :selected_result_id
。然后,在您的控制器中,您必须遍历结果并在除选定结果之外的每个结果上设置result.selected = false
。