LoginSignup
3
1

More than 5 years have passed since last update.

[Rails5] link_toに複数のパラメータをコントローラから渡してみる

Last updated at Posted at 2019-02-23

お久しぶりです

だいぶ久しぶりですね。

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指定にしなさいということです。



おわり

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1