覆盖的路线 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
创建的部分表单,它正在 new
和 edit
操作中加载。
这工作正常,路由生成正确,所有显示 :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
阅读更多相关信息
在我的一个模型中,我有一个名为 token
的字段,它是使用 before_create
创建的。它再也不会被修改。
在 routes.rb
中我使用它而不是 id,例如:resources :model, param: :token
例如 edit
路线现在是 model/:token/edit
。
我正在做的事情find_by(:token, params[:token])
。
我有一个使用 simple_form
创建的部分表单,它正在 new
和 edit
操作中加载。
这工作正常,路由生成正确,所有显示 :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
阅读更多相关信息