您好我想在/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}
答案 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