簡體   English   中英

如何使simple_form與accepts_nested_attributes_for一起做什么

[英]How to make simple_form do what I want with accepts_nested_attributes_for

每個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 在這些情況下,可以選擇任意數量的結果。 您可以通過一系列復選框來表示這一點, @survey.results每個result一個。

有時@survey.additive == false 在這些情況下,只能選擇一個結果。 您可以使用一系列單選按鈕來表示這一點, @survey.results每個result一個。

我正在使用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>錯誤贏得了一個undefined method 'name' for #<SimpleForm::FormBuilder:0x007fbd1f687048>

我的第二個步驟是刪除:label => r.name ,但結果是四行單選按鈕,每行標記為“已選擇”,每行包含一個“是”單選按鈕和一個“否”單選按鈕。 分開表示,是指在一行中選擇“是”會取消選擇該行中的“否”,但對其他行中的單選按鈕沒有影響。 (我實際上需要的是四個連接的單選按鈕,每個按鈕在@survey.results帶有一個result.name標記,以便取消選擇這四個按鈕中的任何一個都將取消選擇其他三個按鈕。)

之后,我嘗試了許多變體,但到目前為止,我的所有嘗試都失敗了。 我該怎么辦?

underfined method 'name'錯誤可以通過使用r.object.name來克服。

如果將selected設置為true可以得到很多結果,那么就足夠了,並且應該可以在上述情況下工作。 如果沒有,請繼續閱讀。

布爾值上帶有radio_buttons的東西是它們將生成yesno選項。 如果只希望選擇一個結果,建議切換到Survey has_many :resultsbelongs_to :selected_result 然后,你就可以建立一套單選按鈕來設置selected_result_id ,從產生survey.results

如果不是這樣,則必須使用自定義驗證來驗證Survey,以便它只能具有一個selected_result(為此添加一個范圍),並為attr_accessor :selected_result_id構建一個由survey.results生成的單選按鈕。 然后,在控制器中,您將必須遍歷結果並為除選定結果以外的所有結果設置result.selected = false

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM