Rails URL 助手和“delegated_type”

Rails URL helpers and `delegated_type`

提问人:DEfusion 提问时间:9/15/2023 最后编辑:DEfusion 更新时间:9/15/2023 访问量:45

问:

假设我有像delegated_type文档一样的设置:

class Entry < ApplicationRecord
  belongs_to :account
  belongs_to :creator
  delegated_type :entryable, types: %w[ Message Comment ]
end

module Entryable
  extend ActiveSupport::Concern

  included do
    has_one :entry, as: :entryable, touch: true
  end
end

class Message < ApplicationRecord
  include Entryable
end

class Comment < ApplicationRecord
  include Entryable
end

然后我设置了我的路线。resources :messages

如何将 Rails url 助手与这些一起使用,例如:

form_with model: Entry.new(entryable: Message.new)

因此,它基本上解析为messages_path

我已经研究了直接决心,但不确定它们中的任何一个是否正确,因为我无法让它与任何一个一起工作。


编辑:

因此,如果我要这样做,我有一部分工作:

resolve('Entry') { |e| [e.entryable_type.demodulize.downcase.to_sym] }

然后使用 .url_for(@entry)message_path

但是,如果我有像这样嵌套的消息:

resources :accounts do
  resources :messages
end

然后给我这个错误:url_for(@account, @entry)

undefined method `account_entry_path'
Ruby-on-Rails 路线

评论


答:

2赞 Alex 9/15/2023 #1

大概是这样的:

direct :entry do |entry|
  route_for(entry.entryable.model_name.singular_route_key, entry)
end

direct :account_entry do |account, entry|
  [account, entry.entryable]
end

undefined method `account_entry_path'

它是一个方法,你可以定义它,它是什么(除了它是在Rails.application.routes.url_helpers中定义的):direct

<%
  def account_entry_path(account, entry, opts = {})
    "/accounts/#{account.to_param}/entries/#{entry.to_param}"
  end
%>
<%= url_for [Account.first, Entry.first] %> #=> /accounts/1/entries/1

resolve不适用于嵌套路由。

评论

1赞 DEfusion 9/20/2023
这是完美的,正是我需要的。我的模型是命名空间的(所以 Foo::Entry),所以我只需要添加就可以让它们使用这种方法。谢谢!foo.rbdef self.use_relative_model_naming? = true