Невозможно отобразить 2 партиала на одной странице - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь выполнить задачу «простой список задач», но я не знаю, как отобразить ее на одной странице, как на скриншоте http://joxi.net/v29DKEVcBLB5mG (то есть есть список сохраненных элементова справа - форма для добавления новой).Если все отдельно, это работает для меня, но когда он отображает 2 части на одной странице - ошибка undefined method each for #<Track:0x00007f8fc42c2698> (NoMethodError in Tracks#new) Вот мой 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

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 29 мая 2019

Так как вы отображаете страницу для Tracks # new action, она должна быть

def new
  @tracks = Track.all
  @track = Track.new
end

и

<% @tracks.each do |track| %>

в итераторе представления.Также вам нужно добавить @tracks = Track.all к действию create, в противном случае вы не сможете отобразить таблицу дорожек при ошибке проверки.

Обратите внимание, что по договоренности мы используем множественное число для коллекций и одиночное для отдельной записи.Вам нужно иметь и @tracks, и @track в действии new, поскольку вы хотите отобразить все страницы и создать новую.

Кстати, вы где-нибудь используете действие index?Если нет, вы можете безопасно удалить его из контроллера и routes.rb

1 голос
/ 29 мая 2019

В контроллере попробуйте использовать @ дорожек для нескольких записей.

  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 для одной и нескольких записей. Попробуйте использовать его @ track для нескольких записей и @ track для одного объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...