

現在、下記のようなコードになっており、

[code]

    current_page?(controller: 'foo', action: 'bar')
    
[/code]

今回は、actionを増やしたい(違うactionでも動かせる）と考えています。  
しかし条件演算子でかいてもうまくいかないです。  
下記のように書いても、片方のactionしか動かないです

[code]

    - if current_page?(controller: 'locations', action: "new" || "index")
    
[/code]

どのようにかけばうまく動作させることができるのか教えていただきたいです。  
よろしくお願い致します。


CC BY-SA 3.0
2016-09-06T02:55:35.320
28712
2016-12-06T07:21:24.233
13491
question
ruby-on-rails ruby
ハッシュの中に条件演算子を加えたい


`"new" || "index"`は常に`"new"`にしかならないので、`current_page?(controller: 'locations',
action: "new")`と書いたのと同じなのが、意図どおりに動かない原因だと思います。

[`current_page?`の実装](https://github.com/rails/rails/blob/606ce3f907cbccd9159bb558c0b57433b42f3975/actionview/lib/action_view/helpers/url_helper.rb#L525)を見ると途中で`url_for`で変換されてしまうようなので1度に判定するのは難しそうです。

愚直な案でよければ以下のようにやれば動くかと思います。

### 案1. `case/when`で1つずつ判定する

[code]

    - case
    - when current_page?(controller: 'locations', action: "new")
    - when current_page?(controller: 'locations', action: "index")
    
[/code]

### 案2. `Array#any?`を使う

[code]

    - if %w[new index].any? {|action| current_page?(controller: 'locations', action: action) }
    
[/code]

実際の使われ方とか周辺コードがわからないのであれですが……個人的には、`current_page?`って必要以上に複雑な感じがするので`controller_name`、`action_name`とかでシンプルに`Array#include?`とか`case/when`とか`==`とかで比較したほうがわかりやすそうな気がしています。

例えば、コントローラ側でどういうアクションが対象かを定義しておいて、

[code]

    class LocationsConroller < ApplicationController
      HOGE_ACTIONS = %w[index new]
    end
    
[/code]

ビューで判定するとかですね。

[code]

    - if LocationsConroller::HOGE_ACTIONS.include?(action_name)
    
[/code]

定数定義やロジックを`LocationsHelper`に切り出してもいいと思います。


CC BY-SA 3.0
2016-09-06T05:49:39.087
28715
2016-09-06T05:49:39.087
18706
28712
answer


おまけでちょいやりすぎな別案を載せておきます。

いっそのこと`current_page?`の挙動を変えてしまえーという暴挙です。

[code]

    # ヘルパー
    module ApplicationHelper
      def current_page?(options)
        if options.kind_of?(Hash) && options[:actions]
          options[:actions].any? {|action| super(options.merge(action: action)) }
        else
          super
        end
      end
    end
    
    # ビュー
    - if current_page?(controller: 'locations', actions: %w[new index])
    
[/code]

`current_page?`に渡す引数が`action`ではなく`actions`なのに注意してください。


CC BY-SA 3.0
2016-09-06T06:20:55.033
28717
2016-09-06T06:20:55.033
18706
28712
answer