Rails - 基于对象值的link_to路径

时间:2013-04-02 18:38:48

标签: ruby-on-rails

我在索引视图中有一个User对象列表。对于每个用户,我正在显示一个带有link_to调用的名称,用于编辑用户,如下所示:

<% @users.each do |u| %>
  <%= link_to u.name, edit_user_path(u) %><br/>
<% end %>

我想根据用户的角色属性(例如员工,经理等)使用不同的编辑路径。我的路线中有edit_employee_pathedit_manager_path等。

动态确定link_to的第二个参数的最佳方法是什么?我可以用一堆丑陋的if / else代码破解它,但我想用最惯用的Rails方式来做。

2 个答案:

答案 0 :(得分:5)

辅助方法怎么样

您可能是users_helper或您选择的任何其他帮助

def edit_path_by_type(user)
   user.role == "Employee" ? edit_employee_path(user) : edit_manager_path(user)
end

并在您的视图中

<%= link_to u.name, edit_path_by_type(u) %>

答案 1 :(得分:2)

您可以使用Helper模块来确定要运行的* _path方法。例如:

module UsersHelper
  def edit_url(user)
    case user.role
    when :employee
      employee_edit_path(user)
    when :manager
      manager_edit_path(user)
    else
      edit_user_path(user)
    end
  end
end

如果您的路径方法以非常一致的方式命名,您可以调用动态构造的方法,例如:

<%= link_to u.name, send(:"#{u.role}_user_edit_path", u) %><br/>

但是您需要注意始终存在具有相应名称的方法。