#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. Я только что перезапустил все, и теперь он начал работать, как будто базе данных требовалось время для обновления самой себя. Итак, в заключение, просто перезапустите все и посмотрите, сработает ли это тогда.