Неопределенный метод `model_name 'для NilClass: Class - PullRequest
1 голос
/ 16 ноября 2011

Ruby 3.1 Rails 1.9.2 Абсолютный новичок

Проблема начинается, когда я пытаюсь изменить существующее объявление в приложении.

Я получаю сообщение об ошибке "неопределенный метод` имя_модели 'для NilClass: Class ". Вот информация, которая может дать подсказки относительно того, что пошло не так. Я потратил пару часов, пытаясь понять это безрезультатно.

routes.rb

* * 1010

Записи в контроллере

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 ]

4 голосов
/ 16 ноября 2011

Пара вещей:

@ mu-is-too-short пример корректного метода обновления. Вам следует отправлять хэш атрибутов (params[:ad]) объекту @ad, а не параметру params[:id].

Явное написание таких маршрутов может стать очень грязным. Вы можете заменить все, что вы написали в файле routes.rb, следующим:

* * 1010

Это даст вам возможность использовать такие вещи, как

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 , особенно руководство по маршрутизации .

0 голосов
/ 16 ноября 2011

Я думаю, ваш метод контроллера update сбит с толку. Передача идентификатора в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...