2012-05-07 27 views
3

今天早上我与在mongoid是创造一个纪录为未在模型Mongoid attr_accessible不工作

为了克服这一点,我决定实施attr_accessible所定义的属性,这个奇怪的问题,唤醒还提到在Mongoid specification

“提供了可访问字段列表是一个简单的 保护他们的倒数。任何未被定义为访问将导致 错误。” - Mongoid规格

想想都将正常工作,我创建我被插入虚拟的记录,太出乎我的意料的反对没有定义为访问上面

任何的声明将导致错误

这里我的模型结构

class PartPriceRecord 
    include Mongoid::Document 
    field :supplier_id,type: Integer 
    field :part_number,type: String 
    field :part_description, type: String 
    field :core_indicator,type: String 
    field :us_part_price,type: Float 
    field :us_core_price,type: Float 
    field :us_fleet_price,type: Float 
    field :us_distributor_price,type: Float 
    field :ca_part_price,type: Float 
    field :ca_distributor_price,type: Float 
    field :ca_core_price,type: Float 
    field :ca_fleet_price,type: Float 
    field :basic_file_id,type: Integer 
    index :part_number, unique: true 

    validates_presence_of :supplier_id 
    validates_presence_of :part_number 
    #validates_uniqueness_of :part_number 
    validates :part_number ,:format => { :with => /^[a-z0-9A-Z\s*-]+[-a-z0-9\s-]*[a-z0-9\s*-]+$/i ,:message => "Only AlphaNumeric Allowed" } 
    validates :supplier_id, :format => { :with => /^[a-z0-9]+[-a-z0-9]*[a-z0-9]+$/i , :message => "Only Alphanumeric Allowed" } 
    #validates :part_description,:presence => true 

    validates :part_description,:format => { :with => /^[a-z0-9]+[-a-z0-9]*[a-z0-9]+$/i ,:message => "Only Alphanumberic Allowed"} ,:allow_nil => true 
    validates :core_indicator ,:inclusion => { :in => %w(Y N), 
    :message => "%{value} is not a valid Coreindicator must be Y | N" 
    } ,:allow_nil => true,:allow_blank => true 


validates :us_part_price,:us_core_price,:us_fleet_price,:us_distributor_price,:ca_part_price,:ca_core_price,:ca_fleet_price,:ca_distributor_price ,:format => { :with => /^([0-9]+(\.([0-9]{2}|[0-9]{1}))?)$/ ,:message => "should look like money" } ,:allow_nil => true,:allow_blank => true 

    @@required_attributes =[:supplier_id,:part_number,:part_description,:core_indicator,:us_part_price,:us_core_price,:us_fleet_price,:us_distributor_price,:ca_part_price,:ca_core_price,:ca_fleet_price,:ca_distributor_price] 
    @@not_required_attributes = ["_id","basic_file_id"] 
    cattr_reader :required_attributes,:not_required_attributes 
    attr_accessible :supplier_id,:part_number,:part_description, :core_indicator,:us_part_price,:us_core_price,:us_fleet_price,:us_distributor_price,:ca_part_price,:ca_distributor_price,:ca_core_price,:ca_fleet_price,:basic_file_id 
end 

,并在这里,我从我的控制台创建

ruby-1.9.2-head :003 > PartPriceRecord.count() 
=> 260317 ## initial count before creating a new record 
ruby-1.9.2-head :004 > p1 = PartPriceRecord.new(:customer_id => "One",:part_number => "ASA",:supplier_id => "Supp") 
=> #<PartPriceRecord _id: 4fa77921d2d8d60e39000002, _type: nil, supplier_id: "Supp", part_number: "ASA", part_description: nil, core_indicator: nil, us_part_price: nil, us_core_price: nil, us_fleet_price: nil, us_distributor_price: nil, ca_part_price: nil, ca_distributor_price: nil, ca_core_price: nil, ca_fleet_price: nil, basic_file_id: nil> 
ruby-1.9.2-head :005 > p1.save 
=> true ## Record got created 
ruby-1.9.2-head :006 > PartPriceRecord.count() 
=> 260318 ## Count indicating record was created 

任何想法记录,为什么会这样呢?

感谢

+0

那么,那个记录有什么问题? –

+0

@Sergio customer_id属性未在attr_accessible中定义 – Viren

+0

而且它没有在字段中列出,为什么? –

回答

2

你的问题是有效的 - 看来该文件是不一致的,不完全正确,而且有些过时,从下面的测试和Mogoid代码粗略浏览。

attr_protected或NOT attr_accessible的字段忽略质量分配;他们不会在批量分配时提出错误。

在受保护的部分中,“引发错误”不正确,文档甚至与用户和用户不匹配。在可访问部分,“会导致错误”是不正确的,但注释“默默忽略受保护的”给出了一条线索,即不会引发错误,并且忽略质量分配。

这里是一个来自mongoid/spec/mongoid/attributes_spec.rb的支持这个的片段。

describe ".attr_accessible" do 

    context "when the field is not _id" do 

    let(:account) do 
     Account.new(number: 999999) 
    end 

    it "prevents setting via mass assignment" do 
     account.number.should be_nil 
    end 
    end 
... 
end 

您必须将字段customer_id添加到您的PartPriceRecord模型中。用户和PartPriceRecord的测试如下。希望这有助于。

require 'test_helper' 

class PartPriceRecordTest < ActiveSupport::TestCase 
    def setup 
    User.delete_all 
    PartPriceRecord.delete_all 
    end 

    test "User" do 
    assert_equal(0, User.count()) 
    # Set attributes on a user properly. 
    user = User.new(first_name: "Corbin") 
    assert_equal("Corbin", user.first_name) 
    user.attributes = { first_name: "Corbin" } 
    assert_equal("Corbin", user.first_name) 
    user.write_attributes(first_name: "Corbin") 
    assert_equal("Corbin", user.first_name) 

    # Attempt to set attributes a user, raising an error. # <-- This documentation is incorrect, no error is raised 
    #user = User.new(first_name: "Corbin", password: "password") 
    user.attributes = { first_name: "Corbin", password: "password" } # inaccessible field is forced to nil 
    assert_equal("Corbin", user.first_name) 
    assert_equal(nil, user.password) 
    user.write_attributes(first_name: "Corbin", password: "password") # inaccessible field is forced to nil 
    assert_equal("Corbin", user.first_name) 
    assert_equal(nil, user.password) 
    end 

    test "PartPriceRecord" do 
    assert_equal(0, PartPriceRecord.count()) 
    p1 = PartPriceRecord.new(:customer_id => "One",:part_number => "ASA",:supplier_id => "Supp") 
    assert_equal(nil, p1.customer_id) 
    p1.save 
    assert_equal(1, PartPriceRecord.count()) 
    assert_equal(nil, PartPriceRecord.find(p1.id).customer_id) 
    end 
end 
+0

谢谢我猜我在找什么,但是将一个customer_id添加到PartPriceRecord是我无法做到的,因为customer_id只是一个可以在我解析CSV时出现的关键字,因此在任何时候CSV都可以有任何不属于PartPriceRecord的字段都会阻止正在查看attr_accessible的内容 – Viren