我有一个名为Profile的模型,该模型属于User_to,因此有'user_id'供数据库跟踪。在我为此模型制作的本地管理界面中,我想提供允许管理员在编辑屏幕中输入字段的用户名的灵活性,然后将其解析为user_id以保存在控制器中。
但问题是,如何检查用户名是否有有效回报?我发现在ActiveRecord :: Validation中没有用于验证关联是否存在的方法。你将如何应对这种情况?
更新:我想要做的是验证表单中的用户名字段确实是真实用户,然后我可以将user_id保存回管理员正在编辑的配置文件。这里'return'表示返回的用户对象。
答案 0 :(得分:5)
此问题是虚拟属性的理想选择。 不要试图解析用户名,而是让配置文件模型为您完成工作。
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 %>
提交后,username字段的值将自动与所有其他真实的activerecord属性一起传递。 ActiveRecord将查找username = setter并解析关联。 如果关联返回nil(给定用户名不存在记录),则它将当前user_id设置为nil,验证将按预期失败。
您可能希望自定义错误代码以使其更有意义。
编辑:添加了示例。
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
答案 1 :(得分:1)
这是有效记录关联的有用参考:http://guides.rubyonrails.org/association_basics.html
要检查关联是否存在,只需检查关联 .nil?
if @profile.user.nil?
... something ...
end
要检查用户名是否有有效回报,我不太清楚你的意思。你能扩展一下吗?