【问题标题】:Generating the edit path for a nested resource referenced by multiple models为多个模型引用的嵌套资源生成编辑路径
【发布时间】:2011-09-05 02:47:59
【问题描述】:

在 routes.rb 中:

resources :cars do
  resources :reviews
end

resources :motorcycles do
  resources :reviews
end

在评论控制器中:

before_filter :find_parent

def show
  @review = Review.find(params[:id])
  respond_to do |format|
    format.html # show.html.erb
    format.xml  { render :xml => @review }
  end
end

def edit
  @review = Review.find(params[:id])
end

# ...
def find_parent
  @parent = nil
  if params[:car_id]
    @parent = Car.find(params[:car_id])
  elsif params[:motorcycle_id]
    @parent = Motorcycle.find(params[:motorcycle_id])
  end
end

为评论生成“显示”链接很简单(可行):

= link_to "Show", [@parent, @review]

同样,我想为评论引用通用编辑路径,例如(这不起作用):

= link_to "Edit", [@parent, @review], :action => 'edit'

有谁知道这是否可行,如果不可行,如何实现?

【问题讨论】:

  • 原来我正在寻找的答案可以通过 URL 帮助程序“edit_polymorphic_path”找到(参见:rubydoc.info/docs/rails/3.0.0/ActionDispatch/Routing/…)。为了获得我在上面尝试的链接,我能够通过以下方式完成此操作:edit_polymorphic_path([@parent, @review])

标签: ruby-on-rails resources routes nested


【解决方案1】:

事实证明,我正在寻找的答案可以通过 URL 帮助程序“edit_polymorphic_path”找到(参见:http://rubydoc.info/github/rails/rails/master/ActionDispatch/Routing/PolymorphicRoutes)。为了获得我在上面尝试的链接,我能够通过以下方式完成此操作:

edit_polymorphic_path([@parent, @review]) 

【讨论】:

  • 在 Rails 4 中这已更改为 edit_polymorphic_path(@parent, @review)
  • 我不了解 Rails 4,但在 Rails 5 中你确实需要方括号:edit_polymorphic_path([@parent, @review])
【解决方案2】:
link_to 'Edit Review', [:edit, @parent, @review]

【讨论】:

  • 这太酷了,谢谢!!你知道如何在不使用“link_to”帮助器的情况下获得这样的东西吗?
【解决方案3】:

我认为您需要的是多态关联。 Railscasts.com 的 Ryan Bates 完美地解释了这一点。

http://railscasts.com/episodes/154-polymorphic-association

它会让你很容易拥有这样的东西:

用户、经理、备注

一个用户可以有很多笔记 一个经理可以有很多笔记 笔记可以属于用户或经理

用户/1/注释/编辑 经理/1/笔记/编辑

Railscast 将解释如何做到这一点:)

编辑:

def edit
  @reviewable= find_reviewable
  @reviews= @reviewable.reviews
end

private

def find_reviewable
  params.each do |name, value|
    if name =~ /(.+)_id$/
      return $1.classify.constantize.find(value)
    end
  end
  nil
end

然后在你的链接中,它会是这样的:

link_to 'Edit Review', edit_review_path([@reviewable, :reviews])

^^ 未测试。

【讨论】:

  • 事实上,我确实与 Review 模型有多态关联:class Review, belongs_to :reviewables, :polymorphic => true class Car, has_many :reviews, :as => :reviewable class Motorcycle, has_many :reviews, :as => :reviewable 所以不幸的是,我所做的与 Railscast 中提到的没有什么不同,它没有解决如何为这种关联获取“编辑”路线的问题。跨度>
  • 你看过整个 Railscast 吗?他使用:@commentable = find_commentable 并且他有 find_commentable 方法来确定他正在编辑哪个类...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
  • 2014-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多