2013-05-27 20 views
1

我正在构建一个用户模型与其他模型具有多个has_many关系的rails应用程序。在一个视图中对多个实例变量使用if语句 - Rails

class User < ActiveRecord::Base 

    has_many :model_2s 
    has_many :model_3s 
    has_many :model_4s 

end 

然后,我创建一个配置文件页面,其中显示当前用户的每个模型的数据。我做这个使用一个单独的控制器 - profiles_controller.rb

在配置文件控制我的每个基于当前用户的这些模型的创建实例变量:

class ProfilesController < ApplicationController 

    @user = User.find(params[:id]) 
    @model_2s = @user.model_2s.all 
    @model_3s = @user.model_3s.all 
    @model_4s = @user.model_4s.all 
end 

我则能够显示数据从这些实例变量中显示配置文件。我通过调用每种方法来做到这一点。

我现在想添加的功能是显示一些默认数据(如Lorem存有占位符文本)对于用户没有填写领域。

我的问题是,我无法弄清楚如何检查如果这些实例变量中的特定字段为空。

例如,我想沿着线的东西:

<% if @model_2s.field_1.empty? %> 
    <p>Lorem Ipsum</p> 
<% else %> 
    <%= @model_2s.field_1 %> 
<% end %> 

然而,这给出了一个“未定义的方法‘field_1’......”的错误。

我知道如何检查@ model_2s.any?以确认实例变量本身存在,但我希望能够在下一级别进行条件检查 - 实例变量中的字段。

+1

'@ model_2s'是一个枚举(数组)。你可以用'@ model_2s.empty?'测试它是否为空,或者你可以用'@ model_2s.first.field_1.blank?'(这里选中的第一个元素)测试一个特定的元素 – Baldrick

+0

谢谢...不幸的是添加'后。第一个'我仍然得到相同的错误...“未定义的方法'field_1'...” – mgtcampbell

+0

然后你的'@ model_2s'数组是空的。你首先必须检查是否有任何东西被发现,可能是通过做'if @ model_2s.empty? || @ model_2s.first.field_1.blank?'。 –

回答

1

不知道你在做你的看法是什么,但绝对需要循环每个这样的结果集,如果你要访问像field_1

<% @model_2s.each do |m| %> 

    <% if m.field_1.empty? %> 
     <p>Lorem Ipsum</p> 
    <% else %> 
     <%= m.field_1 %> 
    <% end %> 

<% end %> 

这也处理的情况下,当@model_2s是空的。

+0

太好了,谢谢。几个问题 - 1.有一个简单的解释,为什么你只能通过使用每个循环访问实例变量的字段?和2.如果我需要在我认为的许多模型中做到这一点,我应该将它们设置为辅助方法吗? – mgtcampbell

+0

1)因为你正在处理一个数组(实际上是一个ActiveRecord :: Relation,它的行为就像一个数组),你处理数组的方式通常是循环的:)。 2)是的,当然,你可以使用帮手方法来清理查看代码 – mihai

+0

真棒,谢谢:) – mgtcampbell

0

尝试这种方式

<% if @model_2s %> 
<% @model_2s.each do |model_2| %> 
    <% if model_2.field_1.empty? %> 
     <p>Lorem Ipsum</p> 
    <% else %> 
     <%= model_2.field_1 %> 
    <% end %> 
<% end %> 
<% end %> 

这将是内环路..

+0

您无法在枚举上调用field_1。可能是你可以循环访问@ model_2s来获取对象,方法/属性(field_1)被定义。 –

+0

请参阅编辑答案 –

+0

谢谢@Thahakp - 与其他答案似乎相同 - 我需要循环访问实例变量。 – mgtcampbell