【发布时间】:2019-04-27 17:19:57
【问题描述】:
我正在构建一个可以容纳不同类型的播放列表功能,我需要一个通用的 url 帮助器,它可以根据传递给它的对象类型转到控制器#action。
例如:
remove_from_playlist_path(:playlist_id: 1, :content_id: 34)
我尝试的路由:
[:links, :medias, :documents].each do |content|
get 'remove_from_playlist', :controller => :content, :action => :remove_from_playlist, :type => content, :as => 'remove_' + content.to_s + 'playlist'
end
在每个内容类型控制器中,我都有一个从播放列表中删除的操作,如下所示:
def remove_from_playlist
playlist = Playlist.find(params[:playlist_id])
playlist.links.delete @link
removed successfully!'
end
如何让路由正常运行并允许我只传递对象并使用通用 url 帮助程序将其重定向到正确的 {type}#remove_from_playlist?
谢谢!
【问题讨论】:
-
你已经尝试过的任何错误?
-
不是错误,但它为每个控制器创建了不同的路由而不是动态路由,因此我不能使用通用的 _path 助手。为什么投反对票?
-
路由器应该如何判断传递给哪个控制器?参数中没有任何内容可以识别某种类型的媒体 - 据我了解您的方法调用。您是否希望路由器知道或检查某个
content_id是否属于某个媒体类型?那怎么办? -
据我了解您的问题,我正在提供解决方案。不要使用任何 url,只需创建一个辅助方法并执行功能。对于您的问题,这可能是一种非常干净的方式。
-
您可以使用路由约束来加载对象,然后检查它是否属于某种类型。您可能必须为每种类型创建一个路由,然后为每个类型添加一个约束,只允许正确类型的对象路由到它。 guides.rubyonrails.org/routing.html#advanced-constraints
标签: ruby-on-rails ruby ruby-on-rails-4 routing ruby-on-rails-5