Rails партиалы для коллекций не рендеринг - PullRequest
0 голосов
/ 09 мая 2019

Я следую учебному пособию, и мы создаем часть для отображения коллекции данных, но она не отображается. Моя командная строка сервера rails показывает, что транзакция базы данных прошла успешно:

Started GET "/portfolios" for ::1 at 2019-05-09 11:52:03 -0500
Processing by PortfoliosController#index as HTML
  Rendering portfolios/index.html.erb within layouts/portfolio
  Portfolio Load (0.3ms)  SELECT "portfolios".* FROM "portfolios"
  ↳ app/views/portfolios/index.html.erb:5
  Rendered collection of portfolios/_portfolio_item.html.erb [11 times] (2.1ms)
  Rendered portfolios/index.html.erb within layouts/portfolio (5.3ms)
  Rendered shared/_nav.html.erb (0.8ms)
Completed 200 OK in 31ms (Views: 28.6ms | ActiveRecord: 0.3ms)

Вот мой частичный раздел под портфелями / _portfolio_item.html.erb:

<p><%= link_to portfolio_item.title, portfolio_show_path(portfolio_item) %></p>

<p><%= portfolio_item.subtitle %></p>

<p><%= portfolio_item.body %></p>

<%= image_tag portfolio_item.thumb_image unless portfolio_item.thumb_image.nil? %>
<%= link_to "Edit", edit_portfolio_path(portfolio_item) %>
<%= link_to 'Delete Portfolio Item', portfolio_path(portfolio_item), method: :delete, data: { confirm: 'Are you sure?' } %>

Мой индексный просмотр под портфолио / index.html.erb:

<h1>Portfolio Items</h1>

<%= link_to "Create New Item", new_portfolio_url %>

<%= render partial: 'portfolio_item', collection: @portfolio_items %>

И мой портфель_контроллер:

class PortfoliosController < ApplicationController
  layout 'portfolio'

  def index
    @portfolio_items = Portfolio.all
  end

  def show
    @portfolio_item = Portfolio.find(params[:id])
  end

  def new
    @portfolio_item = Portfolio.new
    3.times { @portfolio_item.technologies.build }
  end

  def create
    @portfolio_item = Portfolio.new(portfolio_params)

    respond_to do |format|
      if @portfolio_item.save
        format.html { redirect_to portfolios_path, notice: 'Your portfolio item is now live!' }
      else
        format.html { render :new }
      end
    end
  end

  def edit
    @portfolio_item = Portfolio.find(params[:id])
  end

  def update
    @portfolio_item = Portfolio.find(params[:id])
    respond_to do |format|
      if @portfolio_item.update(portfolio_params)
        format.html { redirect_to portfolios_path, notice: 'The record was successfully updated.' }
      else
        format.html { render :edit }
      end
    end
  end

  def destroy
    @portfolio_item = Portfolio.find(params[:id])
    @portfolio_item.destroy
        respond_to do |format|
      format.html { redirect_to portfolios_url, notice: 'Portfolio was successfully destroyed.' }
    end
  end

  private

  def portfolio_params
    params.require(:portfolio).permit(:title,
                                      :subtitle,
                                      :body,
                                      :main_image,
                                      :thumb_image,
                                      technologies_attributes: [:name])
  end
end

Если что-то понадобится, пожалуйста, дайте мне знать и заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

Убедитесь, что нет CSS или javascript, который удаляет / скрывает ваши представления.Также убедитесь, что у вас есть некоторые экземпляры (строки) портфеля в вашей базе данных.

<%= render partial: 'portfolio_item', collection: @portfolio_items %>

Хотя вы используете коллекцию частично, вы можете попытаться передать локальные переменные ипосмотрите, работает ли это, потому что использование коллекции зависит от имен файлов / моделей, которые могут вызвать проблемы.

Когда вы используете collection: @portfolio_items, тогда вы получаете доступ к использованию @portfolio_items переменной экземпляра в частичном представлении (portfolios/_portfolio_item.html.erb в вашем случае). Вы передаете @portfolio_items, но нигде не используете его, вместо этого вы используете переменную portfolio_item, которая недоступна при частичном просмотре.

Вам необходимопереберите @portfolio_items для отображения ваших предметов.Если вам нужно передать переменные для частичного использования locals.Обновите ваш portfolios/index.html.erb как показано ниже

<h1>Portfolio Items</h1>

<%= link_to "Create New Item", new_portfolio_url %>

<% @portfolio_items.each do |portfolio_item| %>
    <%= render partial: 'portfolio_item', locals: { portfolio_item: portfolio_item } %>
<% end %>
0 голосов
/ 09 мая 2019

Я не знаком с синтаксисом коллекции bbut, чтобы попробовать быстрое исправление:

## index.html.erb

<h1>Portfolio Items</h1>

<%= link_to "Create New Item", new_portfolio_url %>

<% @portfolio_items.each do |item| %>
  <%= render partial: 'portfolio_item', portfolio_item: item %>
<% end %>

Или, если вы действительно хотите быть модным, и ваша модель называется Portfolio, переименуйте свою часть в portfolios/_portfolio.html.erb.Это позволит вам сделать:

## index.html.erb

<h1>Portfolio Items</h1>

<%= link_to "Create New Item", new_portfolio_url %>

<% @portfolio_items.each do |item| %>
  <%= render item %>
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...