Rails:没有路由匹配[PUT]“/ blog / 2”

时间:2013-08-04 18:21:16

标签: ruby-on-rails-3 form-for

我在rails中创建博客应用程序。我有一个创建和更新博客的常用表单。

这是edit和new.html.erb的视图

<%= render :partial => "form"%>

这是_form.html.erb博客的视图:

        <%= form_for @blog do |f| %>
        <%= f.text_field :title, :placeholder => "Title" %><br>
        <%= f.cktext_area :article, :placeholder => "Content", :ckeditor => {:toolbar => "MyToolbar"} %>
        <%= f.submit %>
        <% end %>

我的博客创建成功,但我收到更新操作错误。这是我在博客控制器中的编辑和更新操作:

    def edit
    @blog = Blog.find_by_slug(params[:id])
end
def update
    @blog = Blog.find(params[:id]) || not_found
    @blog.update_attributes(params[:blog]) 
    redirect_to "/blogs/#{@blog.slug}"
end

当我从编辑视图打开表单并单击更新按钮时,它会抛出错误:

   No route matches [PUT] "/blog/2"

我的routes.rb是:

 resources :blogs
 get 'blog', to: 'blogs#index'
 get '/blog/:id', to: 'blogs#show', as: 'blog'

我没有得到它出错的地方。我尝试在form_for中添加“url:blogs_path”,它会删除错误但不保存编辑更改。

任何人都可以帮我解决我在这里出错的地方吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

好。我不明白你为什么要违反惯例。无论如何,如果form_for resource更新操作,使用/resources/:id将自动生成操作URL作为PUT到put 'blog/:id' => 'blogs#update', :as => 'update_blog'

所以要覆盖它,你需要做两件事。

  1. 更新您的路线以支持此功能:
  2. 将此行添加到路线文件中:

    <%= form_for @blog, :url => update_blog_path(@blog) do |f| %>

    将此行置于“资源:博客”电话上方非常重要。

    2。指定表单应提交的URL:

    您需要像这样创建表单标记:

    {{1}}

    试试这个并告诉我们。