我一直难过为什么我的rails应用程序呈现错误的部分。我有两个部分,每个部分与不同的控制器(邀请和访客控制器)相关。一部分列出发送给用户的邀请数量,另一部分列出已确认其邀请的用户。此外,第二部分还允许人们看到确认客人的简单描述。
当我访问与来宾控制器events/1/guests/
相关的链接时,我希望看到与客人资料相关的部分内容。而是呈现与邀请控制器相关的部分。邀请和来宾控制器都是嵌套的事件资源。
以下是我一直在使用的代码。谢谢!
路线
resources :events, only: [:new, :show, :create] do
resources :invitations, only: [:new, :create, :show]
resources :guests, only: :show
end
match '/events/:id/guests', to: 'guests#show'
嘉宾控制器
def show
@event = Event.find_by_id(params[:id])
@guestlist = @event.invitations.where(accepted: true)
end
视图/客人/ show.html.erb
<% provide(:title, @event.eventname + " Guest List") %>
<h1> Guest list for <%= @event.eventname %> </h1>
<% if @event.invitations.any? %>
<%= render @guestlist %>
<% end %>
视图/客人/ _guestlist.html.erb
<li>
<%= guestlist.name %> | <%= guestlist.occupation %> |
<%= guestlist.interests %>
</li>
相反,正在呈现以下部分:
视图/邀请/ _invitation.html.erb
<li>
<%= invitation.name %> | <%= invitation.email %> |
<% if invitation.accepted == true %> <%= "Confirmed" %> <% else %> <%= "Pending" %> <% end %>
</li>
答案 0 :(得分:2)
以下代码段描述了调用部分内容的正确方法:
# app/views/guests/show.html.erb
<%= render :partial => 'guests/guestlist', :locals => {:guestlist => @guestlist} %>
由于您需要访问部分中的@guestlist
实例变量,因此您需要将其作为本地传递。然后,在您的部分中,guestlist
将作为局部变量提供。
然后,在您的部分内容中,您需要迭代访客列表中的成员:
# app/views/guests/_guestlist.html.erb
<% guestlist.each do |guest| %>
<li>
<%= guest.name %> | <%= guest.occupation %> | <%= guest.interests %>
</li>
<% end %>
更新:
OP原始调用部分呈现invitation
部分的原因是@guestlist
实际上由Invitation
个对象组成,因此,<%= render @guestlist %>
方法实际上是寻找名为invitation
的部分名字。从规范的Rails指南:
还有一个简写。假设@products是一个集合 对于产品实例,您只需在index.html.erb中编写它即可 产生相同的结果:
<h1>Products</h1>
<%= render @products %>
Rails通过查看来确定要使用的部分名称 集合中的模型名称。
因此,您需要显式声明要使用的部分的名称,否则默认情况下ActionView将使用invitation
部分。
答案 1 :(得分:1)
如果@guestlist
是Guest
类型的对象,则默认情况下会呈现_guest.html.erb
。
所以,你可以尝试这个
<%= render 'guestlist' %>
变量@guestlist
将自动在部分中使用,因此无需在本地传递它。
希望这有效。
答案 2 :(得分:0)
在您的show动作中,您已定义
@guestlist = @event.invitations.where(accepted: true) # it returns array of obejects or records
现在,请尝试使用以下代码
视图/客人/ show.html.erb
<% unless @guestlist.blank? %>
<%= render "/guests/guestlist" %>
<% end %>
视图/客人/ _guestlist.html.erb
<% @guestlist.each do |guestlist| %>
<li>
<%= guestlist.name %> | <%= guestlist.occupation %> |
<%= guestlist.interests %>
</li>
<% end %>