0

編集:下部のソリューションと選択した回答。


私はしばらく 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 つを結合させます。

その後、チェックしたオプションを自分で保存するだけで済みました。これはコントローラーで行いました。

4

1 に答える 1

3

私は最終的にこの問題を解決しました。データがどのように保存されたかには関係なく、データを 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 つを結合させます。

その後、チェックしたオプションを自分で保存するだけで済みました。これはコントローラーで行いました。

于 2013-02-06T14:50:07.027 に答える