【问题标题】:Rails: No route matches [PUT] "/blog/2"Rails:没有路线匹配[PUT]“/blog/2”
【发布时间】:2013-08-04 18:21:15
【问题描述】:

我正在 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”,它消除了错误但不保存编辑更改。

谁能帮我解决我哪里出错了?

谢谢。

【问题讨论】:

  • 发布你的 routes.rb 文件
  • 我建议您阅读Getting Started with Rails Guide。看来有些基本原理(比如路由)你还不明白。
  • 在控制台运行 rake routes 时检查是否有 'PUT /blog/:id => blog#update' 路由
  • 如果您遵循约定,则该 url 实际上应该是 blogs/:id。您是否自己编写了自定义 REST 路由??
  • @aromero 更新了博客路径的问题。

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


【解决方案1】:

好的。我不明白你为什么要违反约定。无论如何,如果是更新操作,使用form_for resource 会自动生成操作URL 作为/resources/:id 的PUT。

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

  1. 更新您的路线以支持此功能:

将此行添加到您的路线文件中:

put 'blog/:id' =&gt; 'blogs#update', :as =&gt; 'update_blog'

将这一行放在“resources :blogs”调用之上是很重要的。

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

你需要像这样创建表单标签:

&lt;%= form_for @blog, :url =&gt; update_blog_path(@blog) do |f| %&gt;

试试这个并告诉我们。

【讨论】:

  • 嘿,它正在用于更新操作,但由于我有通用的编辑和新建表单,表单无法创建新博客。它在创建新博客时给出错误“没有路由匹配 {:controller=>"blogs", :action=>"update"..."。导致表单中更新url路径的原因。
  • 违背 DRY 原则,为 New 单独创建一个表单。
  • 哦,那是唯一的方法吗?好的,会做的。感谢您的解决方案:-)
  • 这不是唯一的方法 :) 您可以覆盖您的 post call 以匹配您的喜好,并且您不必创建单独的表单。如果你想试试。但是,如果您坐下来思考,您将面临一些可以轻松跨越的障碍。 :) 所以这是你的选择。
  • 只做你所做的更新。 :)post '/blog' =&gt; 'blogs#create'。删除 :as 助手,因为您将无法使用它。现在在表单助手中使用 URL 作为'/blog'+'/:id'(如果你有 id.. 你将不得不使用条件语句来执行此操作)。开始尝试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 2017-07-13
  • 1970-01-01
  • 2013-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多