是否可以覆盖Rails自动生成的URL?例如,假设您有一个对Photo和Post具有多态性的注释对象。假设我们希望以不同的方式处理每个父级的注释对象,因此我们有两个控制器:
resources :photo, shallow: true do
resources :comments, controller: :photo_comments
#...
resources :post, shallow: true do
resources :comments, controller: :post_comments
end
现在我想这样做:
# A Photo comment
= link_to "Open", comment # => /photo_comment/1
# A Post comment
= link_to "Open", comment # => /post_comment/2
这可能吗?或者我是否必须限定整个路径,即link_to "Show", photo_comment_path(comment)
?
我不想使用嵌套路线。
答案 0 :(得分:1)
有问题的网址由polymorphic_url生成。我看待它的方式,你真的不需要覆盖它,只需传递父母和评论,如下所示:
link_to "Open", [:whatever_namespace_there_is, comment.parent, comment]
这比通过辅助方法指定路径更灵活,省去了手动检查父类型的麻烦。
答案 1 :(得分:0)
哦,要回答您的问题,您可以覆盖/复制gems/actionview-<ver>/lib/action_view/helpers/url_helper
和../helpers/tag_helper
中的方法,具体取决于您的操作方式。然后你将在config/initializers
中创建一个.rb文件。这是一个如何工作的例子
ActionView::Helpers::UrlHelper.module_eval do
def link_to_comment(comment_controller, name = nil, options = nil, html_options = nil, &block)
#create new method based on original, add new controller argument
html_options, options, name = options, name, block if block_given?
options ||= {}
html_options = convert_options_to_data_attributes(options, html_options)
url = url_for(options)
urla = url.split("/")#let it generate the url
url = ""
urla.each do |part|
unless part == "comments"#go through each part and find the comments section
url<<part
url<<"/"
else
url<<comment_controller#put the controller where it needs to be
url<<"_"
url<<part
url<<"/"
end
end
html_options['href'] ||= url
content_tag(:a, name || url, html_options, &block)
end
end
您可以在需要时调用此方法,<%= link_to_comment("post", "View", comment) %>
重新启动服务器,应该实现它。如果您的两条评论资源都使用您需要定义的相同路径(例如/post_comment/
,并且您不需要/comment/
而非resources :comments, controller: :photo_comments, path: '/photo_comments'
做任何方法覆盖。