新手问题 [已解决] namespaced controller 用到的 view 里面的 form_for 需要注意的问题

oppih28 · 2014年10月22日 · 最后由 feipinghuang 回复于 2014年10月23日 · 1986 次阅读

原标题: Admin::PostsController 中的方法是否能覆盖掉 PostsController 中的方法?

现在在写的一个 app,它的 PostsController 中对于 update 是这么写的:

def update
  @post = current_user.posts.find(params[:id])

  if @post.update(post_params)
    redirect_to post_path(@post)
    flash[:notice] = "保存成功!"
  else
    render :edit
  end
end

新建立了一个 Admin::PostsController,其中的 update 是这样的:

def update
  @post = Post.find(params[:id])

  if @post.update(post_params)
  redirect_to admin_post_path(@post)
    flash[:notice] = "保存成功!"
  else
    render :edit
  end
end

差别在于,对于普通用户,我要求他只能修改自己的 posts,而对于 admin,可以修改所有的 posts。

现在以 admin 身份登录后,在 /admin/posts/87/edit 中尝试修改内容,点击“Submit”以后,却出错了:

ActiveRecord::RecordNotFound at /posts/87
Couldn't find Post with id=87 [WHERE "posts"."user_id" = ?]

同时 better_errors 给出的出错提示在 PostsController 的 update 那里。

意思是这个 update 跳到了 PostsController 的 update 那里而不是 Admin::PostsController 的 update 那里?

我的 routes.rb 中的内容:

resources :posts

namespace :admin do
  resources :posts
end

两处对应的 views 里分开用了不同的 edit.html.erb,提交的位置用的都是

<%= f.submit "Submit", :disable_with => 'Submiting...' %>

这一点对点击 Submit 后跳到哪里应该是没关系的吧?

标题里这样提问不知是否合适。我在 Admin::PostsController 中还写了 index,show,destroy 都能正常使用,看起来是“覆盖”了 PostsController 中对应的方法。

求解惑,如何能让我在 Admin::PostsController 中的 update 正常工作?

不存在覆盖的问题,就是两个不同的 Controller 检查你 views/admin/posts/edit.html.erb

注意 Namespaces

<%= form_for [:admin, @post] do |f| %>
......
<%= f.submit "Submit", :disable_with => 'Submiting...' %>

#1 楼 @feipinghuang 十分感谢!经过修改现在可以用了。另外请教这一点是怎么知道的,我看过的教程里都没有注意到这个问题,可能我看得不够仔细吧。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号