我有一个表单来制作广告。
控制器:
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”
$ rake routes:
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
我需要帮助。
答案 0 :(得分:15)
当您进行更新时,您必须通过传递id
让Rails知道您要更新的对象。
在edit.html.erb
更改:
<%= form_for @car, :url => adverts_path do |f| %>
为:
<%= form_for @car, :url => advert_path(@car) do |f| %>
顺便说一句,我觉得你的代码很奇怪。为什么您的型号名称与您的控制器和路线不匹配?我的意思是你正在创建一个广告,但你的模型叫做汽车。这没有任何意义。无论是汽车还是广告,都不要混用它们。
答案 1 :(得分: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
答案 2 :(得分:0)
今天我遇到了类似情况,资源和型号名称不匹配。我同意模型和控制器名称需要关联,但您可以将路由名称覆盖为您想要的任何名称。
resources :cars, path: "adverts"
与RESTful路由一起
<%= form_for @car do |f| %>
答案 3 :(得分:0)
您可能还想确保url:
上的@form_form
路径单数。