替代 :id 参数

Alternative for :id param

我有 resources :userscustom_id 内部用户 table。

我想使用 link_to "user", user 方法选择 custom_id 来为 link 提供此字段作为参数。

我的show里面的动作users_controller.rb:

...
  @user = User.find(custom_id: params[:id])
...

更好的管理方法是通过 to_param 方法,您可以在模型中定义该方法。当您将模型实例传递给路径助手时,它会在其上调用此方法,默认情况下 returns id。您可以覆盖它以使用 custom_id 代替。

#in User class
def to_param
  self.custom_id
end

现在你可以说

link_to "user", user_path(@user)

它会生成 html 喜欢

<a href="/users/<@user.custom_id>">user</a>

所以@user.custom_id 将在 params[:id].

中通过

您仍然需要确保通过控制器中的自定义 ID 字段而不是 ID 加载用户。一种常见的模式是将其放入控制器中的受保护方法中:

#in UsersController
protected

def load_user
  @user = User.find(custom_id: params[:id])
end

现在你可以在加载@user的所有动作中说load_user,或者将其放入相关动作的前置过滤器中,这甚至是DRYer。

在您的表格中您可以使用:

<%= link_to @user.name, @user %>

因为你已经在 UsersController 中写了:

...
  @user = User.find(custom_id: params[:id])
...