Ruby on rails 如何验证关联是否有效
我有一个名为Profile的模型,它属于用户,因此数据库需要跟踪“User\u id”。在我为这个模型制作的本地管理界面中,我想提供灵活性,允许管理员在编辑屏幕的一个字段中输入用户名,然后将其解析为用户id以保存在控制器中 然而问题是,我如何检查用户名是否有有效的返回?我发现在ActiveRecord::Validation中没有验证关联是否存在的方法。你将如何处理这种情况Ruby on rails 如何验证关联是否有效,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我有一个名为Profile的模型,它属于用户,因此数据库需要跟踪“User\u id”。在我为这个模型制作的本地管理界面中,我想提供灵活性,允许管理员在编辑屏幕的一个字段中输入用户名,然后将其解析为用户id以保存在控制器中 然而问题是,我如何检查用户名是否有有效的返回?我发现在ActiveRecord::Validation中没有验证关联是否存在的方法。你将如何处理这种情况 更新:我想做的是验证表单中的用户名字段是否确实是真实用户,然后我可以将该用户id保存回管理员正在编辑的配置文件。此处“re
更新:我想做的是验证表单中的用户名字段是否确实是真实用户,然后我可以将该用户id保存回管理员正在编辑的配置文件。此处“return”表示返回的用户对象。这是活动记录关联的有用参考: 要检查关联是否存在,只需检查association.nil
为了检查用户名是否有有效的返回,我不太清楚你的意思。你能详细说明一下吗?这个问题很适合虚拟属性。 与其尝试解析用户名,不如让配置文件模型为您创建作业
class Profile
belongs_to :user
# ...
def username
user.try(:username)
end
def username=(value)
self.user = User.find_by_username(value)
end
end
然后以你的形式
<% form_for @profile do |f| %>
<%= f.text_field :username %>
<% end %>
如果用户id是可选的,那又如何?这里的个人资料可能不属于任何人。有很多方法可以实现这一点。如果用户名不存在,您可能需要更改username=()以返回0,而不是nil。在这种情况下,您可以在保存时检查值是否为==0并使对象无效。验证:确保_username_exists def username=(value)self.user_id=user.find by_username(value)| | 0 end protected def确保_username_exists如果user_id==0#nil是允许的错误。add(:user_id,“username not exists”)返回false end end end这只是一种可能的解决方案。抱歉。我写了一个示例,但注释似乎不能包含代码:S@weppos您可以尝试将该示例放回答案。
username=
是否意味着我们重写rails/active record的默认属性帐户?将值检查为零被认为是一种不好的做法?。除非相反,否则请使用。因此,上面的示例是:除非@profile.user。。某物结束
<% form_for @profile do |f| %>
<%= f.text_field :username %>
<% end %>
validate :ensure_username_exists
def username=(value)
self.user_id = User.find_by_username(value) || 0
end
protected
def ensure_username_exists
if user_id == 0 # nil is allowed
errors.add(:user_id, "Username doesn't exists")
return false
end
end