Overriden route id字段正在重置

时间:2017-12-31 16:58:33

标签: ruby-on-rails ruby ruby-on-rails-5 simple-form

在我的一个模型中,我有一个名为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的值。

我能想出的唯一解决方法是手动设置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

至少没有什么花哨的。

1 个答案:

答案 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

了解更多相关信息