0

私はこのようなコードを持っています。

if star
  href = star_path( :"star[model]" => model.class, :"star[model_id]" => model.id ))
else
  href = unstar_path( :"star[model]" => model.class, :"star[model_id]" => model.id ))
end

ご覧のとおり、star_pathまたはunstar_pathヘルパーのいずれかを呼び出していますが、パラメーターは同じです。このようなパラメータを繰り返すのは気分が悪いです。もっと良い方法があるはずだと感じています。

ありがとう!

4

7 に答える 7

6

試す

options = { :"star[model]" => model.class, :"star[model_id]" => model.id }

if star
  href = star_path(options)
else
  href = unstar_path(options)
end
于 2013-02-28T13:00:29.553 に答える
3

ふたつのやり方:

  • 最初に変数に割り当てます

    path_options = :"star[model]" => model.class, :"star[model_id]" => model.id
    href = star ? star_path( path_options ) : unstar_path( path_options )
    
  • カスタム ヘルパーを使用する

    def custom_star_path( options = {} )
      action = options.delete( :action ) || :star
      action == :star ? star_path( options ) : unstar_path( options )
    end
    

    そして次のように呼び出します:

    custom_star_path( :action => (:unstar unless star), :"star[model]" => model.class, :"star[model_id]" => model.id )
    

    またはさらに簡単:

    def custom_star_path( options = {} )
      options.delete( :has_star ) ? star_path( options ) : unstar_path( options )
    end
    
    custom_star_path( :has_star => star, :"star[model]" => model.class, :"star[model_id]" => model.id )   
    
于 2013-02-28T13:04:30.543 に答える
2
href =
send(
  star ? :star_path : :unstar_path,
  "star[model]".to_sym => model.class, "star[model_id]".to_sym => model.id
)
于 2013-02-28T13:09:26.633 に答える
2

toggle_star_path ヘルパーはどうですか

def toggle_star_path star, model
  options = { :"star[model]" => model.class, :"star[model_id]" => model.id }
  star ? unstar_path(options) : star_path(options)
end

次に、ビューで次のように呼び出します。

toggle_star_path star, model
于 2013-02-28T13:09:31.933 に答える
1

変数メソッドを使用したい場合は、send行く方法だと思います。

ドキュメントによると:

 send(symbol [, args...]) → obj
 send(string [, args...]) → obj

シンボル/文字列で識別されるメソッドを呼び出し、指定された引数を渡します。__send__send という名前が obj の既存のメソッドと衝突する場合に使用できます。メソッドが文字列で識別される場合、文字列はシンボルに変換されます。

于 2013-02-28T13:06:46.513 に答える
1

次のように試してください、単純な2行

options = { :"star[model]" => model.class, :"star[model_id]" => model.id }

href = star ? star_path(options) : unstar_path(options)
于 2013-02-28T13:07:12.687 に答える
0

ここに投稿された他のソリューションを使用して、これに落ち着きました。

options = {:"star[model]" => model.class, :"star[model_id]" => model.id}
href = send((star ? :unstar_path : :star_path ), options)
于 2013-02-28T15:36:03.363 に答える