【问题标题】:How can I get the rails router to choose controller dynamically from content?如何让 Rails 路由器从内容中动态选择控制器?
【发布时间】: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


【解决方案1】:

最终以相反的方式解决了这个问题。

将播放列表中的删除放在播放列表控制器上,而不是在每个内容控制器中重复它并使用Object.const_get(params[:klass]) 将正确的类发送到@playlist.send(klass).delete

希望这将有助于具有类似架构的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 2016-08-23
    • 2011-12-11
    • 2011-02-05
    • 1970-01-01
    • 2013-12-29
    • 2017-10-17
    相关资源
    最近更新 更多