Rails 3:更新方法重定向问题

时间:2011-04-02 21:45:21

标签: ruby database ruby-on-rails-3 routing

尝试使用rails 3为博客构建CMS 在我的routes.rb ...

namespace :admin do  
  resources :posts  
  root :to => "home#index"  
end

在Admin :: PostsController中......

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

  respond_to do |format|
    if @post.update_attributes(params[:post])
      format.html { redirect_to(@post,
                  :notice => 'Post was successfully updated.')}
      format.xml  { head :ok }
    else
      format.html { render :action => "edit" }
      format.xml  { render :xml => @post.errors,
                    :status => :unprocessable_entity }
    end
  end
end

我不得不更改admin / _form.html.erb的第一行,因为之前的“未定义方法”错误让我发疯。试图将浏览器指向不存在的“post_path”。

<%= form_for(@post, :url => admin_posts_path(@post)) do |f| %>

帖子的所有其他方法都按预期工作。表单提交(更新) - rails服务器......

Started POST "/admin/posts.1"
ActionController::RoutingError (No route matches "/admin/posts.1"):

首先,好奇为什么它使用POST而不是PUT进行更新。

其次,我无法弄清楚为什么URL被解释为“/admin/posts.1”以及如何修复它。

还有其他人遇到过这个问题吗? (是的,我正在密切关注rubyonrails.org指南以帮助我)。任何帮助将不胜感激。

编辑:
theIVadmin_posts_path(@post)更改为admin_post_path(@post)

rails服务器...
     NoMethodError (undefined method 'post_url' for #<Admin::PostsController:0x00000102b26ff8>): app/controllers/admin/posts_controller.rb:55:in 'block (2 levels) in update' app/controllers/admin/posts_controller.rb:53:in 'update'

1 个答案:

答案 0 :(得分:4)

我相信你应该点击admin_post_path(@post),而不是admin_posts_path(@post)

查看列出在guides.rubyonrails.org上为您的路线创建的所有帮助程序的表。

编辑:另外,您是否尝试过网址的数组样式?这很方便。

<%= form_for([:admin, @post]) do |f| %>

编辑2:我对“未定义的方法post_url”的猜测来自您的更新操作:

format.html { redirect_to(@post,
              :notice => 'Post was successfully updated.')}

它也需要被命名空间:

format.html { redirect_to([:admin, @post],
              :notice => 'Post was successfully updated.')}