1

我一直很困惑为什么我的 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>
4

3 回答 3

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默认使用部分。

于 2013-07-07T19:29:27.157 回答
1

如果@guestlist是 type 的对象Guest,则默认情况下会渲染_guest.html.erb

所以,你可以试试这个

<%= render 'guestlist' %>

变量@guestlist将在部分中自动可用,因此无需在本地传递它。

希望这有效。

于 2013-07-07T19:29:55.110 回答
0

在你的表演动作中,你已经定义了

@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 %>
于 2013-07-07T19:39:04.853 回答