NilClass:Class的未定义方法`model_name'

时间:2011-11-16 18:23:59

标签: ruby-on-rails

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 %>

任何帮助将不胜感激。 感谢。

2 个答案:

答案 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