在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'
是否有人知道这是否可能,或者如果没有,这是如何实现的?
答案 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])
^^未经测试。