Ruby 3.1 Rails 1.9.2绝对newb
当我尝试在应用程序中编辑现有广告时,麻烦就开始了。
我得到“未定义的方法`model_name'为NilClass:Class”错误。以下是可能提供有关出错的线索的信息。我花了几个小时试图弄明白无济于事。
的routes.rb
match 'ads/:id/edit' => 'ads#edit'
match 'ads/:id/update' => 'ads#update'
match 'ads/' => 'ads#index'
match 'ads/new' => 'ads#new'
match 'ads/create' => 'ads#create
控制器中的条目
def edit
@ad=Ad.find(params[:id])
end
def update
@ad=Ad.find(params[:id])
@ad.update_attributes(params[:id])
redirect_to "/ads/#{@ad.id}"
end
查看:
<%= form_for(@ad,:url=>{:action=>'update'}) do |f| %>
<p><b>Name</b><br /><%= f.text_field :name %></p>
<p><b>Description</b><br /><%= f.text_area :description, rows: 10 %></p>
<p><b>Price</b><br /><%= f.text_field :price %></p>
<p><b>Seller</b><br /><%= f.text_field :seller_id %></p>
<p><b>E-mail</b><br /><%= f.text_field :email %></p>
<p><b>Img url</b><br /><%= f.text_field :img_url %></p>
<p><%= f.submit "Update" %></p>
<% end %>
任何帮助将不胜感激。 感谢。
答案 0 :(得分:4)
有几件事:
@ mu-is-too-short的更新方法示例是正确的。您应该将属性散列(params[:ad]
)发送到@ad
对象,而不是参数params[:id]
。
明确写出这样的路线可能会非常混乱。您可以使用以下内容替换您在routes.rb
文件中编写的所有内容:
resources :ads
这将使您能够使用
之类的东西redirect_to ad_path(@ad)
取代
redirect_to "/ads/#{@ad.id}"
此外,您的表单更易于管理且不易出错,因为您可以这么说:
<%= form_for @ad do |f| %>
<p><b>Name</b><br /><%= f.text_field :name %></p>
<p><b>Description</b><br /><%= f.text_area :description, rows: 10 %></p>
<p><b>Price</b><br /><%= f.text_field :price %></p>
<p><b>Seller</b><br /><%= f.text_field :seller_id %></p>
<p><b>E-mail</b><br /><%= f.text_field :email %></p>
<p><b>Img url</b><br /><%= f.text_field :img_url %></p>
<p><%= f.submit "Update" %></p>
<% end %>
顺便说一句,我建议稍微研究一下HTML语义。看起来更像这样的表单更易于维护和样式,并且更易于访问:
<%= form_for @ad do |f| %>
<fieldset>
<%= f.label :name %>
<%= f.text_field :name %>
</fieldset>
<fieldset>
<%= f.label :description %>
<%= f.text_area :description, :rows => 10 %>
</fieldset>
<!-- etc -->
<fieldset>
<%= f.submit 'Update' %>
</fieldset>
<% end %>
如果您还没有,我强烈建议您阅读所有Rails Guides,尤其是guide on routing。
答案 1 :(得分:0)
我认为你的update
控制器方法很混乱。将ID传递给update_attributes
将无法获得您想去的任何地方,您希望将某些属性传递给该方法,并且这些属性应该在params[:ad]
中,一些错误处理也可能很好:
def update
@ad = Ad.find(params[:id])
if(@ad.update_attributes(params[:ad]))
# It worked, redirect to the show action.
else
# It didn't work, make them do it again.
end
end