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

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

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

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

Q&A

1回答

961閲覧

ブロック内の特定のメソッドに同じオプションをつけたい

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails

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

0グッド

0クリップ

投稿2019/03/01 06:14

編集2019/03/05 08:31

with_options みたいに
特定のブロック内で特定のメソッドに同じオプションをつけたいです

show の場合だけフォームメソッドに全部 readonly: true を付けるみたいなことをやりたい場合
特定の条件で hash の中に要素を追加するって3項演算子で短くかけなくて

option = {} option[:readonly] = true if action_name == :show f.text_field, option

みたいにかなり冗長になってしまうのできれいにかく方法はないでしょうか

追記

<%= form_for(@user) do |f| %> <% def f.text_field *args, **option option[:readonly] = true if true action_name == :show f.text_field args, option end %> <%= f.text_field ... %>

のような感じでこのブロック内だけ text_field をオーバーライドするみたいなことはできないでしょうか
パーシャルビューの中にすべてオプションを受け渡してつけてまわるのがすごく冗長な気がして…

追記

https://guides.rubyonrails.org/form_helpers.html#customizing-form-builders

これを使えばできそうかなと思ったんですが
試しに app/helpers/readonly_form_builder.rb に

class ReadonlyFormBuilder < ActionView::Helpers::FormBuilder def text_field(attribute, options={}) options['readonly'] = true super end end

とかいて namespace 内のモデルの _form.html から

<% form_option = readonly ? {builder: ReadonlyFormBuilder} : {} %> <%= form_for @campaign, form_option do |f| %>

という感じでよんでみたんですが
uninitialized constant ActionView::CompiledTemplates::ReadonlyFormBuider
となってしまいます

FormBuilder を継承したクラスをnamespace内のビューで使うにはどこにおいてどうやって呼び出せばいいんでしょうか

ReadonlyFormBuider のインスタンスを作るときにパラメーターを追加して
readonly 以外にも任意のオプションを追加できるようにすることはできるでしょうか

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

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

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

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

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

guest

回答1

0

特定の条件で hash の中に要素を追加するって3項演算子で短くかけなくて

ruby

1option = action_name.eql?(:show) ? { readonly: true } : {} 2 3# もしくは 4option = {} 5action_name.eql?(:show) ? option.merge!(readonly: true) : nil

こういうことですか?

投稿2019/03/01 06:40

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2019/03/01 08:43

最初からオプションがなければこれでよかったんですが 最初からオプションが有る場合に条件で追加する記述がわからなくて merge(q? : {}) を使えばよかったんですね ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問