5

広告を作成するためのフォームがあります。

コントローラー:

  def edit
    @engines = Engine.all
    @car = Car.find(params[:id])
  end

  def update
    @car = Car.find(params[:id])

    if @car.save
      redirect_to root_path
    end
  end

私のルート:

resources :adverts

Create.html.erb

<%= form_for @car, :url => adverts_path do |f| %>

  <div><%= f.label :name %><br />
  <%= f.text_field :name %></div>

  <%= hidden_field_tag :model_id, params[:model_id] %>

  <%= select_tag :engine_id, options_from_collection_for_select(@engines, "id", "name",:selected=>@car.engine_id) %>

  <div><%= f.submit "Create car!" %></div>
<% end %>

広告を作成できますが、更新できません。

edit.html.erb

<%= form_for @car, :url => adverts_path do |f| %>

  <div><%= f.label :name %><br />
  <%= f.text_field :name %></div>

  <%= hidden_field_tag :model_id, params[:model_id] %>

  <%= select_tag :engine_id, options_from_collection_for_select(@engines, "id", "name",:selected=>@car.engine_id) %>

  <div><%= f.submit "Update car!" %></div>
<% end %>

フォームを送信すると、エラーが発生しました - [PUT] "/adverts" に一致するルートがありません

$レーキルート:

                       adverts GET    /adverts(.:format)                     adverts#index
                               POST   /adverts(.:format)                     adverts#create
                    new_advert GET    /adverts/new(.:format)                 adverts#new
                   edit_advert GET    /adverts/:id/edit(.:format)            adverts#edit
                        advert GET    /adverts/:id(.:format)                 adverts#show
                               PUT    /adverts/:id(.:format)                 adverts#update
                               DELETE /adverts/:id(.:format)                 adverts#destroy

私は助けが必要です。

4

4 に答える 4

15

更新するときは、更新するオブジェクトを Rails に渡す必要がありますid

変化edit.html.erb

<%= form_for @car, :url => adverts_path do |f| %>

に:

<%= form_for @car, :url => advert_path(@car) do |f| %>

ところで、私はあなたのコードが非常に奇妙だと思います。モデル名がコントローラーやルートと一致しないのはなぜですか? つまり、広告を作成していますが、モデルは車と呼ばれています。それは意味がありません。それを車または広告と呼びますが、それらを混同しないでください.

于 2012-11-30T06:10:28.037 に答える
4

RESTful ルーティングを使用した場合は、 を指定する必要はありません。必要なのは次のurlとおりです。

<%= form_for @car do |f| %>

フォーム@carは、新しいレコードまたは保存されたレコードを認識できるため、適切な http メソッドを送信します。

そしてあなたの更新アクションで:

def update
  @car = Car.find(params[:id])

  if @car.update_attributes(params[:car])
    redirect_to root_path
  end
end
于 2012-11-30T06:17:30.533 に答える
0

今日、リソースとモデル名が一致しないという同様の状況に陥りました。モデル名とコントローラー名を関連付ける必要があることに同意しますが、ルート名をオーバーライドして好きな名前にすることができます。

resources :cars, path: "adverts"

RESTful ルーティングとともに

<%= form_for @car do |f| %>
于 2016-08-03T10:41:13.490 に答える