use*_*402 69 ruby ruby-on-rails
我有一个我的用户的显示页面,每个属性应该只在该页面上可见,如果它不是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
tad*_*man 179
有一种方法可以帮到你:
def show
  @city = @user.city.present?
end
该present?为不可─方法测试nil加了内容.空字符串,由空格或制表符组成的字符串被认为不存在.
由于这种模式很常见,甚至在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你需要区分最后两个状态.
Tha*_*you 11
你可以使用.present吗?它包含在ActiveSupport中.
@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?改用.
| 归档时间: | 
 | 
| 查看次数: | 124708 次 | 
| 最近记录: |