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 回答