在轨道中缺少部分

时间:2015-12-04 12:07:14

标签: ruby-on-rails ruby

您好我想在/notes/show_html.slim中显示@detail,但我有错误缺少部分详细信息/ _detail with 我如何在/notes/show.html.slim中输出@detail

的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}

5 个答案:

答案 0 :(得分:3)

= render @note.details,希望使用名为detail

的模板呈现每个对象(details/_detail.html.slim

您可以阅读here

details/show.html.slim用于呈现特定资源的show动作。

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}

答案 1 :(得分:0)

这与集合渲染在Rails中的工作方式一致。 @note.details是一个对象的集合,因此当你执行render @note.details时,Rails将遍历集合,并且集合中的每个对象通过调用该对象上的to_partial_path来确定要使用的部分。在这种情况下,该方法将返回details/detail,以便Rails尝试渲染。 如果要指定其他部分,则需要将渲染更改为:

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

答案 2 :(得分:0)

Rails中的部分名称应以_(_ partial.html.slim)开头,然后您可以

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

您可以找到here

的更多信息

答案 3 :(得分:0)

rails的部分语法是 _name_of_partial.html.erb / slim / 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

答案 4 :(得分:0)

来自Rails doc

  

部分名称带有前导下划线,以区别于常规视图

因此您需要将 details / show.html.slim 更改为 details / _show.html.slim

之后,您可以在notes / 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