0

country属性的默认值为 nil。

在国家表中,一些记录有image_url,其余记录的country属性为零。

所以我在助手中编码了这个

def image(user)
    if user.country.image_url
        image_tag "flags/#{user.country.image_url}.png" 
    end
end

但是,它在image_url为 nil时返回错误

Something went wrong

我该如何解决?

4

2 回答 2

3

您需要两个条件:用户必须有一个国家,并且该国家必须有一个 image_url。只有这样,才会有一些东西可以展示。幸运的是,这是一个简单的调整:

def image(user)
    if(user.country && user.country.image_url)
        image_tag "flags/#{user.country.image_url}.png" 
    end
end

如果你是偏执狂,你应该确保那user也不nil是。

希望有帮助!

于 2013-02-21T22:03:39.790 回答
3

虽然这样的方法链确实有效,但如果你实现了一些方法委托,你的代码会看起来更干净,耦合度也会降低。

在您的用户模型内部:

class User < ActiveRecord::Base

     belongs_to :country

     delegate :image_url, :to => :country, :prefix => true, :allow_nil => true       

end

现在你的助手变得简单了:

def image(user)
    if user.country_image_url
        image_tag "flags/#{user.country_image_url}.png" 
    end
end

得墨忒耳法则规定:

每个单元应该只对其他单元有有限的了解:只有与当前单元“密切”相关的单元。

另请查看Demeter 的铁路最佳实践法;如果没有别的,您将在 if 语句中为自己节省额外的子句,并且您的代码看起来很漂亮。

于 2013-02-21T22:19:59.277 回答