我正在使用User
创建form_for
。此表单包含email
和auth_token
。
= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f|
%div
= f.label :email
- if params[:email] == nil
= f.text_field :email
- else
= f.text_field :email, :value => params[:email]
%div
- if params[:auth_token] == nil
= f.hidden_field :auth_token
- else
= f.hidden_field :auth_token, :value => params[:auth_token]
%div
= f.submit "Send"
auth_token
实际上并不是User
模型中的属性,但应该传递并在创建过程中使用,如下所示:
class User
include Mongoid::Document
field :email, :type => String, :default => ""
...
after_create :build_user
private
def build_user
auth_token = self.auth_token
...
end
end
现在,首先,当auth_token
通过参数时,auth_id
会被置于形式中。但是,如果表单已提交但已重新呈现,则设计会引发错误,因为User
不是undefined method `auth_token' for #<User:0x007fd702df2b50>
模型中的字段:
auth_token
此外,如果Mongoid::Errors::UnknownAttribute
成功直接从填写了参数的表单提交,那么当然也会提出{{1}}。
如何在没有实际属性的情况下提交要在用户模型中使用的字段?
答案 0 :(得分:1)
添加不应保存在db中的字段..您可以使用attr_accessor :auth_token
所以模型看起来类似于以下
class User
include Mongoid::Document
field :email, :type => String, :default => ""
attr_accessor :auth_token
...
end
这样,用户模型可以响应导致错误的self.auth_token
。
在场景后面attr_accessor
为它创建一个属性,setter和getter方法
所以上面的定义类似于以下......
class User
include Mongoid::Document
field :email, :type => String, :default => ""
# class attribute
@auth_token
def auth_token
# getter method
@auth_token
end
def auth_token=(value)
# setter method
@auth_token = value
end
...
end
但我不确定第二个定义是否符合您的目的,或者它是否会失败......我只使用第一种方法...
最后要注意的一点是:不应该运行自己的身份验证使用类似Devise的内容或任何其他您喜欢的解决方案