お久しぶりです
だいぶ久しぶりですね。
link_toにパラメータを渡したい
link_toにパラメータを渡すとき、
in_view
<%= link_to potepan_category_path(params[:id], source: :grid, color: :green, size: :m) %>
とするとパラメータ部分が冗長になってしまうので
in_view
<%= link_to potepan_category_path(params[:id], @prms) %>
のようにひとつにまとめてみる。
コントローラにて、@prms
をどのように定義すればいいのか?
失敗例
Stringで"source: :grid, color: :green, size: :m"
となるようなメソッドを作り、代入する
@prms = "source: :grid, color: :green, size: :m" #なんらかのメソッドにより生成される
もちろんエラーとなる。
ではどうすればlink_toのparams配下に入れられるか?
成功例
ハッシュを作成する。
def show
@prms = link_params
end
def link_params
hash = {}
active_params(hash: hash, key: :source, val: :grid)
active_params(hash: hash, key: :color, val: :green)
active_params(hash: hash, key: :size, val: :m)
hash
end
def active_params(args)
args[:hash].store(args[:key], args[:val].to_sym) unless args[:val].nil?
end
こんな感じにするとうまくいく。
3つ目のメソッド内unless args[:val].nil?
いらないのでは?と突っ込みたくなると思いますが、
実際僕はkey, valの中には変数をいれてます。
説明のため便宜上、定数にしたってことですね。
じゃあ@prms
に変数をいれたい場合はどうするか。
実際の僕のコードはこんな感じです
def show
@grid_params = link_params("grid") #@prmsと思ってください
@list_params = link_params("list") #@prmsと思ってください
end
def link_params(type)
hash = {}
active_params(hash: hash, key: :source, val: type)
active_params(hash: hash, key: @params_name, val: prm_value(@params_name))
active_params(hash: hash, key: @another_params_name, val: prm_value(@another_params_name))
hash
end
def active_params(args)
args[:hash].store(args[:key], args[:val].to_sym) unless args[:val].nil?
end
@params_name, @another_params_name, prm_value(xxx)
は何かは知らなくて良いです(変数ってことさえわかれば)
商品の表示をgrid/listで使い分けたくてこのコードを書きました。
まあ何が言いたいかというと、こういう場合はString指定はダメでhash指定にしなさいということです。
おわり