【问题标题】:Rails 3 - form_for pluralization causing path/method error on "new" action but not on "edit"Rails 3 - form_for 复数导致“新”操作而不是“编辑”的路径/方法错误
【发布时间】:2012-04-08 22:05:25
【问题描述】:

当我在我的应用程序中转到路径:/genre/new 时,我收到此错误:

myapp/app/views/genre/_form.html.erb where line #1 raised:
undefined method `genres_path' for #<#<Class:0x007fdcb39edcb0>:0x007fdcb39e8080>

但是,当我转到 /genre/:id/edit 时,_form.html.erb 文件呈现没有错误,并且记录更新没有问题。

我的new.html.erbedit.html.erb 文件调用&lt;%= render 'form' %&gt; 而我的_form.html.erb 文件有:

<%= form_for(@genre) do |f| %>
    <%= f.label :title %> <br />  <%= f.text_field :title %>
    <%= f.label :desc %>  <br />  <%= f.text_field :desc %>
    <%= f.submit %>
<% end %>

在genre_controller.rb 中,我的“新建”和“编辑”操作如下:

  def new
    @genre = Genre.new
    current_user.authorize! :create, @genre  # cancan authorization

    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @genre }
    end
  end

  def edit
    @genre = Genre.find(params[:id])
    current_user.authorize! :update, @genre   # cancan authorization
  end

我已经在我的代码库中搜索了字符串“genres”,它出现的唯一位置是在日志中,所以我确定这不是我的代码中的拼写错误。

我的猜测是 Rails 路由系统正确地将“流派”复数为“流派”,但 form_for(或依赖项)正在创建复数“流派”,但仅当传递给它的参数为空或“新”时。

鉴于错误与“genres_path”有关,我在 routes.rb 文件中尝试了以下各种组合,但都没有解决问题:

  match "/genres" => "genre#index", :as => :genre
  match "/genres/:id(.:format)" => "genre#show", :as => :genre
  match "/genre" => "genre#index", :as => :genres
  match "/genre/:id(.:format)" => "genre#show", :as => :genres

有什么想法可以解决这个问题吗?

编辑:这是我的routes.rb 文件中的resources :genre 语句生成的路由:

genre_index GET    /genre(.:format)           {:action=>"index", :controller=>"genre"}
            POST   /genre(.:format)           {:action=>"create", :controller=>"genre"}
  new_genre GET    /genre/new(.:format)       {:action=>"new", :controller=>"genre"}
 edit_genre GET    /genre/:id/edit(.:format)  {:action=>"edit", :controller=>"genre"}
      genre GET    /genre/:id(.:format)       {:action=>"show", :controller=>"genre"}
            PUT    /genre/:id(.:format)       {:action=>"update", :controller=>"genre"}
            DELETE /genre/:id(.:format)       {:action=>"destroy", :controller=>"genre"}

【问题讨论】:

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


    【解决方案1】:

    在 new.html.erb 上试试

    <%= form_for(@genre, :url => genre_path, :method => :post) do |f| %>
    

    假设您将路线设置为资源 - resources :genre

    这也不适用于edit.html.erb

    http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-form_for

    更新:

    这是我们感兴趣的一个

    POST   /genre(.:format)           {:action=>"create", :controller=>"genre"}
    

    试试这个

    <%= form_for(@genre, :url => {:action=>"create", :controller=>"genre"}, :method => :post) do |f| %>
    

    【讨论】:

    • 感谢您的想法。我试过了,它导致了一个不同的错误:没有路由匹配 {:action=>"show", :controller=>"genre"}。但这是一个虚假的错误——我有一条这样的路线。当我运行“rake routes”时,我得到:genre GET /genre/:id(.:format) {:action=>"show", :controller=>"genre"} 错误消息说的确切路线我错过了.知道是什么原因造成的吗?
    • 您能否为所有流派路由添加来自 rake 路由的输出 - 另请参阅更新的答案 - 将方法指定为 put 或 post
    • 在底部查看我在问题中的路线。尝试了 :put 和 :post 作为 :methods - 与以前相同的错误(“没有路由匹配......”)另外,尝试了一些我在文档中看到的东西,但没有成功。这真的让我很难过。感谢您的帮助。
    • 我尝试了你最后一组 form_for 参数,但没有成功。查看多个词典,我发现“流派”是可以接受的复数形式。所以我决定不在这个问题上与 Rails 争论。我回去更改了我的控制器、帮助程序和数据库表的名称,以及一些 link_to 语句。现在一切正常。我想这个故事的寓意是:永远不要在多元化上与 Rails 抗争——你最终会松懈的。再次感谢您的帮助。
    • 我遇到了与复数无关的类似问题。我正在使用带有命名空间(Admin)控制器的非命名空间模型类(Book),因此基于资源的路由被声明为“命名空间:admin do resources:books end”。名为路由的索引的正确路径是“admin_books_path”。但是,正如在这个答案中提供的链接中所解释的那样,form_for(@book) 将把路径变成“books_path”,所以我不得不覆盖:url,写成“form_for(@book, :url => admin_books_path) ",让事情顺利进行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多