編集:下部のソリューションと選択した回答。
私はしばらく Formtastic を使用してきましたが、ほとんどの場合、フォームの作成がどのように簡素化されるかが気に入っています。残念ながら、チェックボックスを使用すると問題が発生しました。フォームを保存/送信した後、何らかの理由でチェックボックスがチェックされません。
コード スニペット
= ff.input :answer, :as => :check_boxes, :collection => ff.object.survey_question.options, :label => ff.object.survey_question.question
-- 以下に示す .options コレクション メソッド:
def options
opts = {}
survey_options.each do |option|
opts[option.option] = option.id.to_s
end
opts
end
提出
フォームは、次の (切り捨てられた) パラメータを返します。
params[:response][:question_responses_attributes] =
{
"0"=>
{"answer"=>"42", "id"=>"1175"},
...,
"3"=>
{"answer"=>["", "52", "54", "56"], "id"=>"1178"},
...
}
データベースに次のように書き込みます
--- - '' - '52' - '54' - '56'
チェックボックスを取得できませんでした (上記のコード入力を使用)。そして、送信時にすべてを取り除き、応答をカスタム形式で保存する場合にのみ。
例えば
params[:response][:question_responses_attributes].each do |key, values|
if values[:answer].is_a?(Array)
values[:answer] = values[:answer].delete_if {|x| x == ""}.join(",")
end
end
最初の空白のオプションを取り除き、配列をカンマ区切りの文字列に分割します。
52,54,56
これまでに試したこと
= ff.input :answer, :as => :check_boxes, :collection => ff.object.survey_question.options, :checked => ff.object.answer.scan(/\w+/), :label => ff.object.survey_question.question
答えを配列に分割します。
= ff.input :answer, :as => :check_boxes, :collection => ff.object.survey_question.options, :label => ff.object.survey_question.question, :input_html => {:checked => true}
すべてのチェックボックスをチェックします。
= ff.input :answer, :as => :check_boxes, :collection => ff.object.survey_question.options, :label => ff.object.survey_question.question, :input_html => {:checked => ff.object.answer.scan(/\w+/)}
すべてのチェックボックスもチェックします。
ノート:
= ff.input :answer, :as => :check_boxes, :collection => ff.object.survey_question.options, :label => ff.object.survey_question.question
チェックされた回答が1つしかない場合(56)に機能し、データベースに保存する前にパラメーターをカスタムフォーマットします
その他のオプション??
他のオプションはありますか?Formtastic WIKI によると、それらは :selected または :checked をサポートしなくなり、モデルの初期化後または選択ボックスとテキスト ボックスを備えたコントローラーで使用されるデフォルト値を設定する別のオプションを提供しました。チェックボックスを使用してこれを行うための有効な方法を見つけることができませんでした。
私は追加の js コードを使用して事後にボックスをチェックすることにオープンですが、フォームがレールでレンダリングされるので、むしろそれを行います...
よろしくお願いします。
編集
私は最終的にこの問題を解決しました。データがどのように保存されたかには関係なく、データを Formtastic に渡す方法にすべて関係していました。
まず、質問回答テーブルとアンケート オプション テーブルの間に結合テーブルを作成する必要がありました。次に、データがすべての調査オプション (質問に基づく) と、質問への回答のためにチェックされたすべてのオプションにアクセスする方法をフォーマットする必要がありました。
class QuestionResponse
has_many :question_response_options
has_many :survey_options, :through => :question_response_options
# Takes all the survey options that are stored in the join
# table and puts the id's into an array
def question_response_options
opts = []
self.survey_options.each do |option|
opts << option.id.to_s
end
opts
end
end
class QuestionResponseOption
belongs_to :question_response
belongs_to :survey_option
end
class SurveyQuestion < ActiveRecord::Base
# Creates hash of option name to id
# { "Law and Order" => 13 }
def options
opts = {}
survey_options.each do |option|
opts[option.option] = option.id.to_s
end
opts
end
end
次に、Formtastic で、情報を送信する方法を変更する必要がありました。
= ff.input :question_response_options, :as => :check_boxes, :collection => ff.object.survey_question.options, :for => :question_response_options
入力は結合テーブル用である必要があり、コレクションは特定の質問のすべてのオプションである必要があり、:for は ID で 2 つを結合させます。
その後、チェックしたオプションを自分で保存するだけで済みました。これはコントローラーで行いました。