質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Haml

Haml(HTML abstraction markup language)は、HTML/XHTMLを効率的に記述するためのマークアップ言語および記法です。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

1304閲覧

railsのform_forでどっちのボタンが押されたかを知りたい

teraterakoya

総合スコア8

Haml

Haml(HTML abstraction markup language)は、HTML/XHTMLを効率的に記述するためのマークアップ言語および記法です。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/07/02 01:35

前提・実現したいこと

railsで情報を取捨選択するシステムを開発しています
ある画面で2つのボタンを配置し、押されたほうをControllerで知りたいです
またコード規約からStrong parametersを使う必要があります

発生している問題・エラーメッセージ

ここで以下のようなform object, Controller, strong parameters を書きました
しかし、期待したようにどっちのボタンが押されたかをstrong parameters経由で取れません
また、= f.text_field :accept のようにすれば入力した値が取れることはわかりました

ruby

1class SampleForm 2 include ActiveModel::Model 3 attr_accessor :accept 4 validates :accept, presence: true 5end 6 7class HogeController 8 def create 9 sample_params 10 redirect_to hoge_path 11 end 12 13 def sample 14 @sample_form = SampleForm.new 15 end 16 17 def sample_params 18 params.require(:sample_form).permit(:accept) 19 end 20end

さらにViewはこのようになっています

haml

1.sample 2 %h2 サンプル 3 = form_for @sample_form, url: admin_search_category_recipe_removable_check_index_path, method: :post do |f| 4 = f.text_field :accept 5 .screening-container 6 %hr 7 .center 8 = f.submit "accept", {class: "button", name: "accept"} 9 = f.submit "deny", {class: "button", name: "deny"}

補足情報(FW/ツールのバージョンなど)

railsは5系を使っています
アドバイスお願いします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/07/02 01:45

> 期待したようにどっちのボタンが押されたかをstrong parameters経由で取れません どのような期待をしていたのですか?
teraterakoya

2020/07/02 01:57

> ある画面で2つのボタンを配置し、押されたほうをControllerで知りたいです これを期待していました つまり、`params[:sample_form]{:accept]` の形を期待しています
guest

回答2

0

strong parametersはモデルのカラムだけを受け取る前提となっています。
フォームのボタンはモデルのカラムとは関係ないですよね。
従って、デフォルトではf.submit "accept", name: "accept"とした場合、
<input type="submit" name="accept" value="accept">というHTMLが生成されます。
そしてこれは正しいし、この動作を変える必要はありません。

ボタンが押されたかどうかは、ボタンのnameであるacceptで判定できます。
params[:accept]がnilでなければボタンが押されたという事になります。

具体的にはこんな感じで判定できます。

ruby

1def create 2 if params[:deny] 3 # denyボタンが押された 4 elsif params[:accept] 5 # acceptボタンが押された 6 end 7 8 ... 9end

投稿2020/07/02 02:06

mingos

総合スコア4025

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

つまり、params[:sample_form]{:accept] の形を期待しています

では、両方のボタンにname="sample_form[accept]"と設定して、区別できるようなvalueを付けてください。

投稿2020/07/02 01:59

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

teraterakoya

2020/07/02 02:07

こうすればいいのですね! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問