我认为这是一个艰难的问题。我有一个评论控制器,我想用于所有其他控制器:如书籍,标题等。
问题是,评论中的创建操作是:
def create
@book = Book.find(params[:book_id])
@comment = @book.comments.create!(params[:comment])
respond_to do |format|
format.html {redirect_to @book}
format.js
end
端
那么如何才能使用动作&评论控制器的标题,如果它明确使用书籍属性?
答案 0 :(得分:5)
我假设您在评论中设置了多态关联,因此它可以属于许多不同类型的模型?看一下this Railscasts episode,它会向您展示如何将其与控制器操作一起设置。这是代码的关键部分。
# comments_controller
def create
@commentable = find_commentable
@comment = @commentable.comments.build(params[:comment])
if @comment.save
flash[:notice] = "Successfully created comment."
redirect_to :id => nil
else
render :action => 'new'
end
end
private
def find_commentable
params.each do |name, value|
if name =~ /(.+)_id$/
return $1.classify.constantize.find(value)
end
end
nil
end
# routes.rb
map.resources :books, :has_many => :comments
map.resources :titles, :has_many => :comments
map.resources :articles, :has_many => :comments
答案 1 :(得分:0)
这也是我考虑过的事情。首先,您必须使create方法独立于父方法。
然后你会有几个选择:
我自己对Rails相当新,所以我不知道这是做事的“正确方法”,也许其他人有更好的解决方案。
答案 2 :(得分:0)
嗯,如果没有具体说明每个控制器的属性,你就不能这样做。
如果您想为应用程序中的一组模型创建一般注释模型,则需要传递您要评论的模型类型(但不是模型本身),然后创建一个根据你传递的内容提供不同行为的开关。
def create
if params[:type]="book"
@book = Book.find(params[:book_id])
@comment = @book.comments.create!(params[:comment])
respond_to do |format|
format.html {redirect_to @book}
format.js
elsif params[:type]="title"
@title = Title.find(params[:title_id])
@comment = @title.comments.create!(params[:comment])
respond_to do |format|
format.html {redirect_to @title}
format.js
end
end
答案 3 :(得分:0)
我认为resource controller可能就是你要找的东西。资源控制器上的Here's another link。