控制器与轨道中的多个控制器相关

时间:2009-08-15 03:06:57

标签: ruby-on-rails controller

我认为这是一个艰难的问题。我有一个评论控制器,我想用于所有其他控制器:如书籍,标题等。

问题是,评论中的创建操作是:

  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

那么如何才能使用动作&评论控制器的标题,如果它明确使用书籍属性?

4 个答案:

答案 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方法独立于父方法。

然后你会有几个选择:

  1. 对评论可能附加的每件事都有一个belonsg_to,并有选择地填写其中一个。
  2. 将书籍/标题/等归属于评论
  3. 我自己对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