在我的一个模型中,我有一个名为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
的值。
我能想出的唯一解决方法是手动设置url
simple_form_for
字段,但如果我这样做,则会中断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
至少没有什么花哨的。
答案 0 :(得分:2)
simple_form
在为您生成路由字符串时使用Rails的默认行为。由于config/routes.rb
只是为 Outside In URL提供了命名模式匹配,因此对于来自内部的应用程序来说它没有多大意义。例如,使用这样的路线
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
了解更多相关信息