Rails 3 - форма_для множественного числа, приводящая к ошибке пути / метода при «новом» действии, но не при «редактировании» - PullRequest
2 голосов
/ 24 марта 2012

Когда я иду по пути: /genre/new в моем приложении я получаю эту ошибку:

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

Однако, когда я захожу в / genre /: id / редактирую файл _form.html.erb отображается без ошибок, и запись обновляется без проблем.

Мои new.html.erb и edit.html.erb файлы вызывают <%= render 'form' %>, а мой _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 мои действия 'new' и 'edit' следующие:

  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

Я выполнил поиск в моей кодовой базе для поиска строки «жанры», и единственное место, где это происходит, - в журналах, поэтому я уверен, что это не опечатка в моем коде.

Я предполагаю, что система маршрутизации Rails правильно преобразует «жанр» в «жанр», но form_for (или зависимость) создает плюрализирующие «жанры», но только когда передаваемый ему параметр пуст или «новый».

Учитывая, что ошибка связана с 'genres_path', я попробовал различные комбинации следующих в моем файле rout.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

Есть мысли о том, как я могу обойти это?

EDIT: Вот маршруты, сгенерированные оператором resources :genre в моем routes.rb файле:

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"}

1 Ответ

3 голосов
/ 25 марта 2012

на 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| %>
...