提问人:DEfusion 提问时间:9/15/2023 最后编辑:DEfusion 更新时间:9/15/2023 访问量:45
Rails URL 助手和“delegated_type”
Rails URL helpers and `delegated_type`
问:
假设我有像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'
答:
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.rb
def self.use_relative_model_naming? = true
评论