【发布时间】:2017-12-31 16:58:33
【问题描述】:
在我的一个模型中,我有一个名为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
至少没有什么花哨的。
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-5 simple-form