2015-12-04 3 views
0

Здравствуйте я хочу, чтобы показать @detail в /notes/show_html.slim, но у меня есть ошибка Отсутствует частичную деталь/_detail с как я могу выводить @detail в /notes/show.html.slimОтсутствует частичной в рельсах

routes.rb

Rails.application.routes.draw do 
    root 'static_pages#home' 
    match '/about_me', to: 'static_pages#about', via: 'get' 
    devise_for :users 
    resources :users, only: [:index, :show] 
    resources :notes do 
    resources :details 
    end 
end 

details_controller.rb

class DetailsController < ApplicationController 
    def new 
    @note = Note.find(params[:note_id]) 
    @detail = Detail.new 
    end 

    def create 
    @note = Note.find(params[:note_id]) 
    @detail = @note.details.build(detail_param) 
    if @detail.save 
    redirect_to note_path(@note) 
    end 
end 

    def destroy 
    @note = Note.find(params[:note_id]) 
    @detail = @note.details.find(params[:id]) 
    @detail.destroy 
    redirect_to note_path(@note) 
    end 

    private 

    def detail_param 
    params.require(:detail).permit(:body) 
    end 
end 

и просмотров

/notes/show.html.slim

#note 
    #post_content 
    .show 
    h1 = @note.title 
    = render @note.details #or = render 'details/show'? 
    .date 
    p Created #{time_ago_in_words(@note.created_at)} ago 
    hr 
    -if @note.user_id == current_user.id 
    p=link_to 'Edit', edit_note_path(@note), class: 'btn btn-primary' 
    p=link_to 'delete', note_path, method: :delete, data: { confirm: "Delete note?" }, class: 'btn btn-primary' 
    p=link_to 'Add details', new_note_detail_path(@note), class: 'btn btn-primary' 
    hr 
    .body 
     p #{@note.body} 

/details/show.html.slim

div class="details" 
    p #{@detail.body} 

ответ

3

= render @note.details, ожидает визуализации каждого объекта (detail), используя шаблон под названием details/_detail.html.slim

Вы можете прочитать об этом here

details/show.html.slim предназначено для визуализации шоу действия для конкретного ресурса.

details/_detail.html.slim предназначен, например. визуализируйте каждую строку для details/index.html.slim, передавая объект detail.

Если show шаблон действительно подходит, то вы можете сделать что-то вроде этого:

# /notes/show.html.slim 
= render @note.details.each do |detail| 
    = render 'details/show', detail: detail 

-

# /details/show.html.slim 
- detail ||= @detail 
div class="details" 
    p #{detail.body} 
+0

** Спасибо! ** работа! –

0

Это согласуется с тем, как коллекция рендеринга работает в Rails. @note.details представляет собой набор объектов, поэтому, когда вы делаете render @note.details, Rails будет циклически перебирать коллекцию, и для каждого объекта в коллекции определяется, какой частичный использовать, вызывая to_partial_path на этом объекте. В этом случае метод вернет details/detail, так что Rails попытается выполнить рендеринг. Если вы хотите указать другой частичный, вам необходимо изменить визуализацию на что-то вроде:

= render partial: 'OTHER_PARTIAL', collection: @note.details

0

Частичное имя в Rails должно начинаться с _ (_partial.html.slim) и рядом вы можете

<%= render :partial => 'tasks/your_partial' %> 

Более подробную информацию вы можете найти here

0

частичный синтаксис для рельсов _name_of_partial.html.erb/тонкий/Haml Это ошибка, которую вы получаете. Мой совет вам придерживаться условностей, если вы хотите повторно отобразить данные данных, в другом представлении вы должны иметь частичный _data.html.slim внутри вашей папки представлений деталей, поэтому вы можете называть это из шоу на деталях и от показа на показать ваши заметки, это может быть, как это

ноты/show.html.slim

#note 
#post_content 
.show 
    h1 = @note.title 
    = render 'details/data' data: @details 
    .date 
    p Created #{time_ago_in_words(@note.created_at)} ago 
    hr 
    -if @note.user_id == current_user.id 
    p=link_to 'Edit', edit_note_path(@note), class: 'btn btn-primary' 
    p=link_to 'delete', note_path, method: :delete, data: { confirm: "Delete note?" }, class: 'btn btn-primary' 
    p=link_to 'Add details', new_note_detail_path(@note), class: 'btn btn-primary' 
    hr 
    .body 
    p #{@note.body} 

детали/_data.html.slim

div class="details" 
    p #{data.body} 

Я также предлагаю вам читать тщательно http://guides.rubyonrails.org/layouts_and_rendering.html

0

От Rails doc:

Partials названы с ведущим подчеркиванием, чтобы отличить их от обычных взглядов

Так вы необходимо изменить подробности/show.html.slim до подробнее/_show.html.slim.

После этого, вы можете использовать партиалы в заметках/show.html.slim как

= render partial: "details/show", collection: @note.details, as: :detail 

Обратите внимание, что для визуализации коллекции, используя :collection вариант короче, чем каждый цикл.

И детали/_show.html.slim, как

# details/_show.html.slim 
div.details 
    p= detail.body 
Смежные вопросы