使用form_for创建Mongoid对象:如何提交非模型属性的字段?

时间:2014-06-01 11:46:41

标签: ruby-on-rails ruby-on-rails-4 devise mongoid form-for

我正在使用User创建form_for。此表单包含emailauth_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}}。

如何在没有实际属性的情况下提交要在用户模型中使用的字段?

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的内容或任何其他您喜欢的解决方案