3

パスに移動すると /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ファイルが呼び出さ<%= 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 では、「新規」および「編集」アクションは次のとおりです。

  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 ルーティング システムは "genre" を "genre" に正しく複数形化しますが、form_for (または依存関係) は複数形 "genres" を作成していますが、渡されたパラメーターが空または "new" の場合のみです。

エラーが '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

これを回避する方法について何か考えはありますか?

編集:私のファイルの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"}
4

1 に答える 1

3

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| %>
于 2012-03-24T20:43:27.527 に答える