覆盖的路线 ID 字段正在重置

Overriden route id field is being reset

在我的一个模型中,我有一个名为 token 的字段,它是使用 before_create 创建的。它再也不会被修改。

routes.rb 中我使用它而不是 id,例如:resources :model, param: :token

例如 edit 路线现在是 model/:token/edit

我正在做的事情find_by(:token, params[:token])

我有一个使用 simple_form 创建的部分表单,它正在 newedit 操作中加载。

这工作正常,路由生成正确,所有显示 :token: 而不是 :id

show 操作正常。在显示页面中,我有一个 link_to 链接到编辑视图。这也很好用。

两者都在路由中使用:token,编辑视图加载模型字段,一切正常。

然而,当您查看编辑视图的源代码时,它会将操作显示为 /model/<id>,而不是 /model/<token>。例如 /model/5

当您提交编辑表单时,它会尝试转到 /model/5/

此外,当我检查正在发送的参数时,它显示 token 设置为 id 的值。所以不知何故, token 字段已被重置。

所以

1) token 字段以某种方式被重置为 id 的值。我不知道这是怎么回事。

2) simple_form 似乎是根据 id 而不是 token 生成动作。但是我已经意识到,由于 token 正在重置,因此 simple_form 可能没有做错任何事情并且正在使用 token 的值。

我唯一能想出的解决方法是手动设置 simple_form_for 中的 url 字段,但如果我这样做,它就会破坏 new 操作。

对于 simple_form 我只是在做: <%= simple_form_for @model do |f| %>

routes.rb我在做:

resources :model, param: :token

在控制器中,edit 动作是:

@model = Model.find_by(token: params[:token])

update 操作是:

@model = Model.find_by(token: params[:token])
if @mode.update model_params
  redirect_to model_path @model.token
else
  render 'edit'
end

一点也不花哨。

simple_form 在为您生成路由字符串时使用 Rails 的默认行为。由于config/routes.rb只是为Outside InURL提供了命名模式匹配,所以对于内部应用来说意义不大。例如,使用这样的路线

model/:token/edit

只是意味着 model//edit 之间的任何字符串都将分配给 params[:token]。这并不意味着字符串必须是 YourModel#token 的值。当然,您可以通过相同的方式将该模式分配给 params[:foobar] 而不会破坏任何东西 model/:foobar/edit

要将 id 键完全替换为 token 键,您必须重写方法 YourModel#to_param

# app/models/your_model.rb
class YourModel < ActiveRecord::Base
  def to_param
    token
  end
end

这样,ActiveSupport 就会知道在从内向外生成路由模式时使用 token 作为值。

您可以在 Rails's Guides

阅读更多相关信息