Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails ruby/rails:如果用户可能还没有用户配置文件,那么引用某个user.user\u profile.name的正确方法是什么?_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails ruby/rails:如果用户可能还没有用户配置文件,那么引用某个user.user\u profile.name的正确方法是什么?

Ruby on rails ruby/rails:如果用户可能还没有用户配置文件,那么引用某个user.user\u profile.name的正确方法是什么?,ruby-on-rails,ruby,Ruby On Rails,Ruby,当可能存在或可能不存在特定用户的用户配置文件记录时,引用当前的\u user.user\u profile.name的正确方法是什么 我有两个表,User(:email)和UserProfile(:name,:company) 用户有一个用户配置文件,而用户配置文件属于用户 配置文件可能存在,也可能不存在。(对于用户来说是可选的) 在我的许多代码和视图中,我想显示用户名和公司,例如current\u user.user\u profile.name 当然,如果用户尚未创建其配置文件,则当前的\u

当可能存在或可能不存在特定用户的用户配置文件记录时,引用当前的\u user.user\u profile.name的正确方法是什么

我有两个表,User(:email)和UserProfile(:name,:company)

用户
有一个
用户配置文件,而用户配置文件
属于
用户

配置文件可能存在,也可能不存在。(对于用户来说是可选的)

在我的许多代码和视图中,我想显示用户名和公司,例如
current\u user.user\u profile.name

当然,如果用户尚未创建其配置文件,则当前的\u user.user\u配置文件为nil,因此引用当前的\u user.user\u profile.name会引发错误

我知道如何使用错误的方法(每次需要名称时,在引用.name字段之前检查nil)


我能想到的最好方法是创建一个名为
name
的用户方法,该方法执行nil检查,以便当前的\u User.name返回名称(如果没有配置文件,则返回“”。但这感觉也不对,因为我必须为我添加到用户配置文件中的每个字段编写一个方法。

current\u user.user\u profile.name rescue“Not Available”
current\u user.user\u profile.name rescue“Not Available”
您可以使用
试试看:

current_user.user_profile.try(:name) || "Not Available"

当您使用
rescue
时,由于
user\u profile
nil
,您可能会使用
try
,因此您可能会从与
NoMethodError
不同的错误类型中进行补救:

current_user.user_profile.try(:name) || "Not Available"
current_user.andand.user_profile.name || "Not Available"
当您使用
rescue
时,由于
user\u profile
nil
,您可能会从与
NoMethodError
不同的错误类型中进行补救

current_user.andand.user_profile.name || "Not Available"
实现空安全链接

正如您所建议的,创建一个
User.name
方法可能更可取(并且会感到自豪)

实现空安全链接

正如您所建议的,创建一个
User.name
方法可能更可取(并且会感到自豪)。

您是正确的。根据,最好的方法是使用此逻辑在用户上添加一个方法。任何需要用户名的东西都不需要知道用户的配置文件

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

所以

class用户
你是对的。根据,最好的方法是使用此逻辑在用户上添加一个方法。任何需要用户名的东西都不需要知道用户的配置文件

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

所以

class用户
您可以这样做,这样可以处理
用户配置文件的所有属性:

# User.rb
def try_this(attribute)
  self.user_profile ? self.user_profile.send(attribute) : "Not Available"
end
那你就给我打电话

current_user.try_this(:name)
编辑

迪伦的
try
方法同样有效:

def try_this(attribute)
  self.user_profile.try(attribute) || "Not Available"
end

您可以这样做,以处理
UserProfile
的所有属性:

# User.rb
def try_this(attribute)
  self.user_profile ? self.user_profile.send(attribute) : "Not Available"
end
那你就给我打电话

current_user.try_this(:name)
编辑

迪伦的
try
方法同样有效:

def try_this(attribute)
  self.user_profile.try(attribute) || "Not Available"
end

我同意Demeter回答的法则,但是Rails有一种方便的方式让您的用户类将:name和其他方法委托给它的用户配置文件:

class User < ActiveRecord::Base
    has_one :user_profile

    delegate :name, :email, :phone, :height, :etc,
        to: :user_profile, allow_nil: true, prefix: :profile

end
如果
user.user\u profile
为nil,则将返回nil,否则将分别返回
user.user\u profile.name
user.user\u profile.email
user.user\u profile.phone
。但他们对只与用户交互的呼叫者隐瞒了这一事实。如果您希望使用以下选项,可以省去前缀选项:

user.name
user.email
user.phone

一般来说,我会避开涉及异常或救援的策略,除非零用户配置文件确实是不应该发生的事情。我不喜欢使用And和And或尝试,因为他们把管理用户配置文件的责任推给了调用者。

我同意Demeter回答法,但Rails有一种方便的方式让用户类将:name和其他方法委托给它的用户配置文件:

class User < ActiveRecord::Base
    has_one :user_profile

    delegate :name, :email, :phone, :height, :etc,
        to: :user_profile, allow_nil: true, prefix: :profile

end
如果
user.user\u profile
为nil,则将返回nil,否则将分别返回
user.user\u profile.name
user.user\u profile.email
user.user\u profile.phone
。但他们对只与用户交互的呼叫者隐瞒了这一事实。如果您希望使用以下选项,可以省去前缀选项:

user.name
user.email
user.phone

一般来说,我会避开涉及异常或救援的策略,除非零用户配置文件确实是不应该发生的事情。我不喜欢使用And和And或尝试,因为他们把管理用户配置文件的责任推给了呼叫者。

谢谢,尽管在我引用当前用户配置文件中的每个字段的每个地方都使用该序列似乎不太理想。用户配置文件谢谢,虽然在每个地方都使用该序列似乎不太理想,但我引用了当前用户档案中的每个字段。用户档案伟大的解决方案,因为它还解决了不必为用户档案中的N个不同字段重新写入相同内容的问题!我将这样实现它,名称与try_profile()类似,因此我还可以为其他模型添加try_foo()和try_bar()。这是一个很好的解决方案,因为它还解决了不必为user_profile中的N个不同字段重新编写相同内容的问题!我将这样实现它,名称与try\u profile()类似,因此我还可以为其他模型添加try\u foo()和try\u bar()。