Пытаюсь сделать задачу "простой список дел", но не знаю как вывести на одной странице как на скрине http://joxi.net/v29DKEVcBLB5mG (т.е. там список сохраненных элементов и справа форма для добавление нового). Если все по отдельности у меня работает, но когда рендерит 2 партиала на одной странице - ошибка undefined method each for #<Track:0x00007f8fc42c2698> (NoMethodError in Tracks#new)
Вот мой новый.html.erb
<h1> Create a New Item!</h1>
<%= render 'table' %>
<%= render 'form' %>
Частичная таблица:
<table border = "1">
<thead>
<tr>
<th>ID</th>
<th>All Tracks</th>
<th>It's description</th>
<th>Priority</th>
<th>Date</th>
<th>Delete</th>
<th>Restore</th>
</tr>
</thead>
<tbody>
<% @track.each do |track| %>
<tr>
<td> <%= track.id %> </td>
<td> <%= link_to track.item, edit_track_path(track.id) %> </td>
<td> <%= track.description %> </td>
<td> <%= track.priority %> </td>
<td> <%= track.created_at.strftime('%d/%m/%Y') %> </td>
<td><%= button_to "Delete", track_path(track.id), method: :delete %></td>
<td><%= button_to "Restore", track_path(track.id), method: :put %></td>
</tr>
<% end %>
</tbody>
</table>
И частичное _form:
<%= form_for @track do |f| %>
<p>
<%= f.label :item %><br>
<%= f.text_field :item %>
</p>
<p>
<%= f.label :description %><br>
<%= f.text_area :description %>
</p>
<p>
<%= f.select :priority, priorities,
prompt: "Select priority" %>
</p>
<p>
<%= f.submit %>
</p>
<% end %>
<%= link_to 'Back', tracks_path %>
<%= link_to 'Home', root_path %>
И контроллер треков:
class TracksController < ApplicationController
before_action :find_track, only: [:show, :edit, :update, :destroy]
def index
@track = Track.all
end
def show
end
def new
@track = Track.new
end
def create
@track = Track.new(track_params)
if @track.save
flash[:success] = "It works!"
redirect_to tracks_path
else
flash[:success] = "Its wrong!"
render 'new'
end
end
def update
if @track.update(track_params)
redirect_to @track
else
render 'edit'
end
end
def edit
end
def destroy
@track.destroy
redirect_to tracks_path
end
private
def track_params
params.require(:track).permit(:item, :description, :priority)
end
def find_track
@track = Track.find(params[:id])
end
end
Заранее спасибо!
Добавьте TracksController к вопросу, пожалуйста
@Vasilisa только что добавила
инженермнкы Нет, не знаю. Я добавил код своего контроллера в публикацию, на самом деле, если я устанавливаю @tracks, все равно появляется та же ошибка.
В контроллере попробуйте использовать @треки для нескольких записей.
def index
@tracks = Track.all
end
В таблице частично используйте приведенное ниже
<table border = "1">
<thead>
<tr>
<th>ID</th>
<th>All Tracks</th>
<th>It's description</th>
<th>Priority</th>
<th>Date</th>
<th>Delete</th>
<th>Restore</th>
</tr>
</thead>
<tbody>
<% @tracks.each do |track| %>
<tr>
<td> <%= track.id %> </td>
<td> <%= link_to track.item, edit_track_path(track.id) %> </td>
<td> <%= track.description %> </td>
<td> <%= track.priority %> </td>
<td> <%= track.created_at.strftime('%d/%m/%Y') %> </td>
<td><%= button_to "Delete", track_path(track.id), method: :delete %></td>
<td><%= button_to "Restore", track_path(track.id), method: :put %></td>
</tr>
<% end %>
</tbody>
</table>
Вы использовали @track для одной и нескольких записей. Попробуйте использовать @треки для нескольких записей и @отслеживать для одного объекта.
Та же ошибка (неопределенный метод "каждый" для nil:NilClass NoMethodError в Tracks#new)
Поскольку вы визуализируете страницу для действия Tracks#new, она должна быть
def new
@tracks = Track.all
@track = Track.new
end
а также
<% @tracks.each do |track| %>
в итераторе представления. Также вам нужно добавить @tracks = Track.all
к действию create
, иначе вы не сможете отображать таблицу треков при ошибке проверки.
Обратите внимание, что по соглашению мы используем множественное число from для коллекций и единственное число для одной записи. Вам нужно иметь как @tracks
, так и @track
в действии new
, так как вы хотите отобразить все страницы и создать новую.
Кстати, вы где-нибудь используете действие index
? Если нет, вы можете безопасно удалить его из контроллера и routes.rb
@KevinLingard, рад помочь вам
@track
— это один объектTrack
. Вы тоже ставите@tracks
? Если это так, измените вид таблицы на@tracks.each do
.