как мне исправить неопределенный метод `user_id’ для nil: NilClass?

#ruby-on-rails

#ruby-on-rails

Вопрос:

я пытаюсь запустить свой сервер после db: migrate: reset и внезапно мой сервер SQlite3 не запускается. Я получаю сообщение об ошибке: ActionView::Template::Error (undefined method 'user_id' for nil:NilClass) когда сервер начинает отображать мою datum/index страницу. До того, как я сделал это, у меня были фактические цены в моей базе данных, поэтому можно было определить user_id, и все работало, но теперь, когда цены исчезли, я полагаю, что это выдает эту ошибку.

Контроллеры Datum amp; Price :

 def index
  @prices = Price.all
end
  

Просмотры datum/index amp; prices/index :

 <h1>Prices</h1>

<table>
  <tr>
    <th>User</th>
    <th>Date</th>
    <th>Price name</th>
    <th>Price</th>
    <th></th>
    <th></th>
    <th></th>
  </tr>

<% @prices.each do |price| %>
  <tr>
    <td><%= price.user_id %></td>
    <td><%= price.date %></td>
    <td><%= price.price_name %></td>
    <td><%= price.price %></td>
    <td><%= link_to 'Show', price %></td>
    <td><%= link_to 'Edit', edit_price_path(price) %></td>
    <td><%= link_to 'Delete', price, :confirm => 'Are you sure?', :method => :delete %></td>
  </tr>
<% end %>
</table>

<br />

<%= link_to 'New Price', new_price_path %>
  

Я думаю, что я делаю это неправильно, поскольку я новичок в Rails. Моей целью было дублировать мой prices/index вид, чтобы мой datum/index был таким же, чтобы я мог придать обоим уникальный вид. Как мне исправить эту проблему и правильно ли я это делаю?

Ответ №1:

Я предполагаю, что вы не знаете, что rake db:migrate:reset делает. Для него нет строки описания, поэтому не спрашивайте, rake что он делает, вам нужно посмотреть на исходный код:

 # desc 'Resets your database using your migrations for the current environment'
task :reset => ['db:drop', 'db:create', 'db:migrate']
  

Поэтому rake db:migrate:reset уничтожает вашу базу данных (включая любые данные, которые у вас были в ней), воссоздает ее заново, а затем применяет миграции, чтобы снова обновить все. Но все ваши исходные данные по-прежнему отсутствуют.

db:drop Часть db:migrate:reset , вероятно, объясняет, почему вы получаете nil повсюду. Однако вы должны получать пустой массив из Price.all , если все ваши данные исчезли, так что, возможно, вы что-то добавили после сброса.

Комментарии:

1. Но в этом случае Price.all будет [] и цикл @prices.each do |price| не будет выполнен, т.е. он не войдет в цикл. Тогда как возникает эта ошибка?

2. Единственными вещами, которые я добавил, были миграция категории и миграция поиска. Это не могло быть причиной.

3. @JustinRoR: Вы проверяли свою базу данных SQLite вручную, чтобы посмотреть, что там?

4. @rubyprince: Отсюда «вы должны получать пустой массив от Price. все, если все ваши данные исчезли, возможно, вы добавили что-то после сброса «внизу.

Ответ №2:

Странно, я думаю, что это выдавало эту ошибку, потому что я использовал AptanaStudio 3 с терминалом git. Я только что перезапустил все, и теперь он начал работать, как будто базе данных требовалось время для обновления самой себя. Итак, в заключение, просто перезапустите все и посмотрите, сработает ли это тогда.