【问题标题】:form_for with :slug instead of :idform_for 用 :slug 而不是 :id
【发布时间】:2020-10-09 22:57:14
【问题描述】:
<%= form_for [current_user, @task] do |f| %>

提供users/:id/tasks,但我需要users/:slug/tasks,因为我正在使用:

resources :users, param: :slug do
  resources :tasks, only: [:index, :new, :create]
end

但如果我使用:

<%= form_for [current_user.slug, @task] do |f| %>

我得到:NoMethodError: undefined method 'jemelle_visits_path' for

如何获得users/jemelle/tasks

【问题讨论】:

    标签: ruby-on-rails form-for nested-form-for


    【解决方案1】:

    我认为您需要覆盖模型的 to_param 方法:

    https://apidock.com/rails/ActiveRecord/Base/to_param

    user = User.find_by_name('Phusion')
    user_path(user)  # => "/users/1"
    

    您可以在模型中覆盖 to_param 以使 user_path 使用用户名而不是用户 id 构造路径:

    class User < ActiveRecord::Base
      def to_param  # overridden
        name
      end
    end
    
    user = User.find_by_name('Phusion')
    user_path(user)  # => "/users/Phusion"
    

    【讨论】:

    • 这出人意料的工作.. 我告诉你一开始不明白这个问题。 #to_param 是否覆盖了 form_for 用于将参数转换为路径的方法?
    • 是的,它就是这样做的,我可以将 User#name 更改为我的 User#slug
    • form_for 使用对象的类型来推断它必须调用user_path,然后user_path 在该对象上调用.to_paramto_param 默认为 id)跨度>
    猜你喜欢
    • 2013-04-22
    • 2021-09-05
    • 2010-10-03
    • 2016-04-01
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 2019-05-11
    相关资源
    最近更新 更多