Ruby on rails 前过滤器的问题
请帮助我试着理解这里发生了什么: 我需要批准一个嵌套的代码段,但当我这样做时,它会说它找不到书。我认为这可能是路由的问题,因为浏览器中的URL与rake路由不匹配 如果有人能握住我的手,像你对孩子一样解释这一点:) 找不到没有ID的书 下面是带有代码段#approve和before#u过滤器的控制器Ruby on rails 前过滤器的问题,ruby-on-rails,Ruby On Rails,请帮助我试着理解这里发生了什么: 我需要批准一个嵌套的代码段,但当我这样做时,它会说它找不到书。我认为这可能是路由的问题,因为浏览器中的URL与rake路由不匹配 如果有人能握住我的手,像你对孩子一样解释这一点:) 找不到没有ID的书 下面是带有代码段#approve和before#u过滤器的控制器 class SnippetsController < ApplicationController before_filter :authenticate_user! before
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
我目前在浏览器中有此功能../snippets/2/activate
呃。。。。不确定我的想法是否正确。您正在向
snippets/:id/activate
发送一个POST
请求,该请求调用snippets#approve
在调用执行@book=book.find(参数[:book\u id])
的SnippetsController
的整个代码段上,有一个before\u filter
。因为您的路径是snippets/:id/activate
,params[:book\u id]
是nil
,因此您将得到该错误
您需要更改snippets#approve
路径以包含book\u id
,或者将book\u id
作为POST
参数传递,以便您的before过滤器可以访问它。这是唯一显示的路径吗?它与您指定的路线不匹配。如果它指向url(snippets/2/activate),则只会出现params[:id]
,任何使用params[:book_id]
查找的尝试都会失败,因为它为零。好的,但我的应用程序的其他部分需要此筛选器。你能再解释一下我需要向过滤器添加什么才能让它通过吗?需要查看控制器代码的其余部分,create是成功的POST方法的正常结果。在创建
过滤器之前的过滤器和创建
过滤器之前的过滤器之间也有区别。看起来你把约定弄混了。很抱歉考虑到我的模型,我会添加完整的控制器代码。我想问题出在你的路线上。您是否可以添加有关书籍和片段的相关部分?我假设您在某个地方有类似于“books/:book\u id/snippets/:id”
的东西,或者可能有一个嵌套的资源路径,这就是为什么您需要before\u过滤器的原因。感谢您的帮助,非常感谢。
post "books/:id/activate" => "books#approve", :as => "active_book"
post "snippets/:id/activate" => "snippets#approve", :as => "active_snippet"