【问题标题】:Using form_for to create Mongoid object: How to submit fields that is not model attributes?使用 form_for 创建 Mongoid 对象:如何提交非模型属性的字段?
【发布时间】:2014-06-01 11:46:41
【问题描述】:

我正在创建一个带有form_forUser。此表单包含一个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 在通过参数时被放入表单中。但是,如果提交了表单但重新渲染,则 devise 会引发错误,因为 auth_id 不是 User 模型中的字段:

undefined method `auth_token' for #<User:0x007fd702df2b50>

另外,如果auth_token直接从用params填写的表单提交成功,那么Mongoid::Errors::UnknownAttribute当然也会被提出。

如何提交要在用户模型中使用的字段而不是实际属性?

【问题讨论】:

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


    【解决方案1】:

    添加一个不应保存在数据库中的字段..您可以使用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 之类的东西或您喜欢的任何其他解决方案

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-07
      • 1970-01-01
      • 2017-08-11
      • 2012-03-11
      • 2012-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多