在我的rails应用程序中呈现的部分错误

时间:2013-07-07 19:22:41

标签: ruby-on-rails ruby-on-rails-3

我一直难过为什么我的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>

3 个答案:

答案 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)

如果@guestlistGuest类型的对象,则默认情况下会呈现_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 %>