问题与before_filter

时间:2013-10-28 19:52:42

标签: ruby-on-rails

请帮助我尝试了解这里发生的事情:

我需要批准一个嵌套代码段,但是当我这样做时说它找不到书。我认为这可能是路由的问题,因为浏览器中的URL与rake路由不匹配。

如果有人可以握住我的手并像对待孩子一样解释这一点:)

  

找不到没有ID的图书

下面是带有片段#enveve和before_filter的控制器。

   class SnippetsController < ApplicationController
  before_filter :authenticate_user!
  before_filter :find_book


   def create
  #raise params.inspect
   @snippet = @book.snippets.create(params[:snippet])
   @snippet.user = current_user
     if @snippet.save
      redirect_to @book
      flash[:success] = "Snippet submitted and awaiting approval."
    else
      flash[:base] = "Someone else has submitted a snippet, please try again later"
      redirect_to @book
   end
 end     


  def approve
   #raise params.inspect
    @snippet = @book.snippets.find(params[:id])
    @snippet.update_attribute(:approved, true)
    redirect_to admins_path

end

  def edit
    @snippet = @book.snippets.find(params[:id])
  end    

  def update
    @snippet = @book.snippets.find(params[:id])

    respond_to do |format|
      if @snippet.update_attributes(params[:snippet])
        format.html { redirect_to @book, notice: 'Comment was successfully updated.' }
      else
        format.html { render action: "edit" }
      end
    end
  end

  private

  def find_book
    #raise params.inspect
    @book = Book.find(params[:book_id])


  end
end

现在我明白了,因为我正在做一个帖子,我的佣金路线就是这样说的。

  

/书籍/:book_id /片段/:ID(:格式)

以下是自定义路线的路线:

  

active_snippet POST / snippets /:id / activate(。:format)

这是我为book&amp;&amp; amp;的自定义路线摘要:批准

post "books/:id/activate" => "books#approve", :as => "active_book"
  post "snippets/:id/activate" => "snippets#approve", :as => "active_snippet"

我目前在浏览器中有这个../ snippets / 2 / activate

呃....不确定我是否正确思考。

1 个答案:

答案 0 :(得分:1)

您向POST发送了snippets/:id/activate个请求snippets#approve

整个before_filter上有一个SnippetsController调用find_book来执行@book = Book.find(params[:book_id])。由于您的路径为snippets/:id/activateparams[:book_id]nil,因此您会收到该错误。

您需要更改snippets#approve路径以包含book_id,或将book_id作为POST参数传递,以便您的过滤器可以访问它。