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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby on Rails

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

Q&A

解決済

1回答

1148閲覧

[Rails ] attr_accessor で追加したフォームパラメーターをモデル内で使う方法

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails

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

0グッド

0クリップ

投稿2019/03/01 05:14

編集2019/03/01 10:46

フォーム内容とカラムの型が違う場合1度 attr_accessor で付与したフィールドでフォームとやりとりして
モデル内で値をカラムにセットする必要があると思うのですがいまいちその一般的なやり方がわかりません

attr_accessor の使い方がまだよくわかっていなくて
データベースに保存されないだけで ruby 上ではカラムと同じように扱えるフィールドという認識で
モデルの中に勝手に値がセットされるんだと思ってたのですが

f.checkbox :gender_form, {multiple:true}, 'male', nil f.checkbox :gender_form, {multiple:true}, 'female', nil

のようなフォームから params => user => gender_form => {'male', 'female'} のような配列パラメーターがとんできて
コントローラーで

def create @user = User.new(user_params) @user.save end def user_params params.require(:user).permit(:gender_form) end

と全部モデルに渡すとモデル内で self.gender_form でアクセスできると思ったのですが

user.rb で

validates :gender_form, presence: true after_validation :set_columns, on: [ :create, :update ] private def set_columns gender = gender_form.join(',') end

とかいても

undefined method `join' for nil:NilClass

となって gender_form の値を取得できません

コントローラーでは当然拾えるので

@user = User.new(user_params) @user.gender = user_params.gender_form.join(',') @user.save

という感じでフォームとカラムの差異の吸収は
コントローラー内でやるべきなのでしょうか

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

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

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

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

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

guest

回答1

0

ベストアンサー

attr_accessorはrubyのメソッドですね。
特に難しいことはしていなくて、インスタンス変数のgetterとsetterを一緒に定義するための便利機能です。
つまり、

attr_accessor :name

は、以下のような定義を書いたのと同じことになります。

def name @name end def name=(val) @name = val end

参考 : https://docs.ruby-lang.org/ja/latest/method/Module/i/attr_accessor.html

データベースに保存されないだけで ruby 上ではカラムと同じように扱えるフィールドという認識

これは結果的にそのように使えているというだけですね。

で、前置きが長くなりましたが、動かない原因は、viewのcheckboxに指定しているフィールドが:gender_formではなく:genderになっているためだと思われます^^;

投稿2019/03/01 09:58

Kta-M

総合スコア456

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

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

退会済みユーザー

退会済みユーザー

2019/03/01 10:50

ありがとうございます ビューのソースは前の質問をそのままはりつけてしまったので修正ミスです params には gender_form でとんできていました あれからずっとデバッグしてようやくわかったのですが permit(:gender_form) と書いた瞬間 gender_form が失われてしまうようなのです… ただなぜ消えるのかがよくわかりません とりあえず permit を消せば動くことは確認でくたのですが 質問からは脱線するのでこの辺にしておきますが 方針としてはモデル内で変換をかくというのでいいのでしょうか
Kta-M

2019/03/01 12:44

なるほど、permitは普通に書くと配列を通してくれないみたいですね。 params.require(:user).permit(gender_form: []) とすると大丈夫だと思います。 他のattributeを加工して目的のattributeに値を入れるのであればmodelのコールバックがいいかなと思います。平文パスワードを暗号化してDBに保存するときなんかもこんなやり方をします。 ただ、そもそもこのデータの格納方法が最適なのかはどんなアプリケーションか分からないのでなんとも言えないところです。
退会済みユーザー

退会済みユーザー

2019/03/01 16:54

ありがとうございます! 価が配列の場合はpermitの書き方が違うのですね その書き方だとちゃんと受け取れました しかも他のパラメータと合わせて書く場合最後にかかないとダメみたいでストロングパラメーターも難しいですね…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問