【问题标题】:Overriden route id field is being reset正在重置覆盖的路由 ID 字段
【发布时间】: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 创建的部分表单,它正在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

至少没有什么花哨的。

【问题讨论】:

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


    【解决方案1】:

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

    model/:token/edit
    

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

    要完全用token 键替换id 键,您必须覆盖方法YourModel#to_param

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

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

    您可以在Rails's Guides了解更多信息

    【讨论】:

    • 这修复了它。非常感谢。我还没有在任何地方看到这个记录。
    • @m5tt 我添加了参考文档,以防您想了解更多信息。快乐的黑客攻击!
    • @yeum1vannam 我从没想过会去看那里。我觉得也许应该在路由指南中提到一些关于param 选项的内容。因为我怀疑我没有正确覆盖id,但除了设置param 选项之外,我找不到其他任何东西。再次感谢。
    猜你喜欢
    • 2017-12-16
    • 2020-09-22
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 2023-03-26
    • 2016-09-30
    • 2017-02-15
    • 2014-05-28
    相关资源
    最近更新 更多