生成由多个模型引用的嵌套资源的编辑路径

时间:2011-05-30 23:45:58

标签: ruby-on-rails resources routes nested

在routes.rb中:

resources :cars do
  resources :reviews
end

resources :motorcycles do
  resources :reviews
end

在ReviewController中:

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

为Review创建“show”链接很简单(这可行):

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

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

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

是否有人知道这是否可能,或者如果没有,这是如何实现的?

3 个答案:

答案 0 :(得分:16)

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

edit_polymorphic_path([@parent, @review]) 

答案 1 :(得分:16)

link_to 'Edit Review', [:edit, @parent, @review]

答案 2 :(得分:1)

我认为你需要的是一个多态关联。 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])

^^未经测试。