【问题标题】:Polymorphic Comments in both nested resource and simple resource ruby on rails 4嵌套资源和简单资源 ruby​​ on rails 4 中的多态注释
【发布时间】:2015-12-29 07:52:34
【问题描述】:

我有以下关系路线:

resources :courses, only: [:index, :show] do
  resources :enrols, only: [:new, :create]
  resources :lectures, only: [:show]
end

resources :code_casts, :path => 'casts', :as => 'casts', only: [:index, :show]
resources :blogs, :path => 'blog', :as => 'blog', only: [:index, :show] do
  resources :blog_votes, only: [:create, :destroy]
end

我想要课程、讲座、code_casts 和博客中的多态 cmets。

问题是讲座当然有父级,所以路线将是course/course_id/lecture/id,博客路径将是blog/id,其中 cmets 将有不同的显示页面。

【问题讨论】:

  • 那么到底是什么问题呢?您可以在控制器中实现所需的逻辑(要显示其注释)。 if params[:course_id] ...,将其提取到路由和控制器关注点中。
  • 在链接railscasts.com/episodes/154-polymorphic-association-revised中提供的rails cast中。 cmets 处于相同的资源级别。我不知道如何将嵌套资源关联到 cmets。

标签: ruby-on-rails polymorphism polymorphic-associations


【解决方案1】:

如果我正确理解了这个问题,那么深度嵌套的资源并没有什么特别之处。所以你可能需要这样的东西

# routes.rb
concern :commentable do
  resources :comments
end

resources :courses, only: [:index, :show] do
  resources :enrols, only: [:new, :create]
  resources :lectures, only: [:show], concerns: [:commentable]
end

resources :code_casts, :path => 'casts', :as => 'casts', only: [:index, :show]
resources :blogs, :path => 'blog', :as => 'blog', only: [:index, :show], concerns: [:commentable] do
  resources :blog_votes, only: [:create, :destroy]
end

这将为讲座和博客创建嵌套的 comments 资源。 比你需要区分 cmets 控制器中的路径

# comments_controller
def create
  Comment.create(commentable: commentable, other_params...) # assuming you have `commentable` polymorphic belongs_to
end

# a little more ugly than Ryan suggests
def commentable
  if request.path.include?('blog') # be careful. any path with 'blog' in it will match
    Blog.find(params[:id]) 
  elsif params[:course_id] && request.path.include?('lecture')
    Course.find(params[:course_id).leactures.find(params[:id]) # assuming Course has_many lectures
  else
    fail 'unnable to determine commentable type'
  end
end

所有“魔法”都采用可注释方法,您可以在其中检查路径并确定要选择的可注释对象。我使用类似的方法,但是这个确切的代码是由内存编写的,没有经过测试。希望你已经明白了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多