我有一个我的用户的显示页面,每个属性应该只在该页面上可见,如果它不是nil而不是空字符串。下面我有我的控制器,为每个变量编写相同的代码行@user.city != nil && @user.city != ""
非常烦人。我不太熟悉创建自己的方法,但我可以以某种方式创建一个快捷方式来执行这样的操作:@city = check_attr(@user.city)
?或者有更好的方法来缩短这个程序吗?
users_controller.rb
def show
@city = @user.city != nil && @user.city != ""
@state = @user.state != nil && @user.state != ""
@bio = @user.bio != nil && @user.bio != ""
@contact = @user.contact != nil && @user.contact != ""
@twitter = @user.twitter != nil && @user.twitter != ""
@mail = @user.mail != nil && @user.mail != ""
end
答案 0 :(得分:168)
有一种方法可以帮到你:
def show
@city = @user.city.present?
end
present?
方法测试不是 - nil
plus有内容。空字符串,由空格或制表符组成的字符串被认为不存在。
由于这种模式非常普遍,甚至还有ActiveRecord中的快捷方式:
def show
@city = @user.city?
end
这大致相同。
作为一个说明,测试vs nil
几乎总是多余的。 Ruby中只有两个逻辑上错误的值:nil
和false
。除非变量可以是文字false
,否则这就足够了:
if (variable)
# ...
end
这比偶尔出现的if (!variable.nil?)
或if (variable != nil)
内容更为可取。 Ruby倾向于使用更简化的表达式。
您希望与nil
进行比较的一个原因是,如果您有一个三态变量,可以是true
,false
或nil
,你需要区分最后两个状态。
答案 1 :(得分:11)
您可以使用ActiveSupport附带的.present?。
@city = @user.city.present?
# etc ...
你甚至可以像这样写
def show
%w(city state bio contact twitter mail).each do |attr|
instance_variable_set "@#{attr}", @user[attr].present?
end
end
值得注意的是,如果您想测试某些内容是否为空白,则可以使用.blank?
(这与.present?
相反)
另外,请勿使用foo == nil
。请改用foo.nil?
。