QA@IT

form_forでデフォで値を渡したい。

7097 PV

railsのform_forでデータをユーザに入力させて、送信させる際にデフォルトであらかじめ値を渡したいのですが、そのやり方がわかりません。
具体的にコードで説明させていただきます。ここではquestion_idという値がdefaultで渡したいものです。

  • view

        <%= form_for @answer,:url => answers_path do |f| %>
            <div class="field">
                <%= f.text_area :text,:size=>"60x10" %>
            </div>
            <%= binding.pry %>
            <div class="actions">
                <%= f.submit %>
            </div>
        <% end %>
    
  • viewが呼び出す前に呼ばれるコントローラ側の処理

    def show
    @question = Question.find(params[:id])
    @answer = Answer.new
    @answer.question_id = "50040468c6727d4ded09999";
    
    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @question }
    end
    end
    

この用に書いてform_forを渡された側でわたってきた値(@answer)を見ても、question_idにはnullが代入されています。
またviewが呼び出す前に呼ばれるコントローラ側で作った@answerに代入されているid(主キー)すらも、渡した側では値がかわっています。

スマートでないやり方なら、viewにhiddenで値を入力し渡すこともできるのですが、クライアント側で書き換えられる可能性があるため、できれば使いたくありません。

なにかいい方法はないでしょうか?

現在rails3.2

回答

formでなんとかしたいのであれば、

<%= f.hidden_field :question_id %>

のようにするしかないです。クライアント側で書き換えられる可能性を排除したいなら、コントローラ内で session にいれるのが一番無難ではないでしょうか

編集 履歴 (0)

回答ありがとうございます。ただそうだとすると少し疑問になるのが、コントローラ側でなぜ
@answer = Answer.new
とするのでしょう?実際に受けとった先のコントローラでここ(viewの前に呼び出されるコントローラ)でつくったインスタンス(@answer)の値が引き継がれない(==破棄される)なら、インスタンスを作成する必要性がないように感じます。
<%= form_for Answer do |f| %>
では駄目なのでしょうか?

編集 履歴 (0)
  • いや、冷静に考えるとhiddenで渡すためにあると考えれる事に気がつきました。失礼しました。 -
  • そうですね。コントローラ側でインスタンスを設定するのは hidden_field (や他の _field 系メソッド) のデフォルト値を設定するのが目的です -
ウォッチ

この質問への回答やコメントをメールでお知らせします。