2013-10-01 63 views
0

这里是我的用户模型保存方法不写入数据库

class User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    has_many :personas 
    has_many :stories, through: :persona 

    validates_presence_of :name 

    attr_accessor :name, :default_persona_id 
    after_create :create_first_persona 

private 
    def create_first_persona 
    @persona = Persona.new 
    @persona.user = self 
    @persona.name = self.name 
    if @persona.save 
     make_first_persona_default 
    end 
    end 

    def make_first_persona_default 
    @user = self 
    @user.default_persona_id = @user.personas.first.id 
    @user.save!(:validate => false) 
    end 
end 

它所做的是,在每次创建人物角色一个用户注册,然后将这种生活的ID作为用户default_persona_id。

一切正常,除了make_first_persona_default。当我在rails控制台中检查用户时,default_persona_id是零。

我on Rails的4

UPDATE

编辑make_first_persona_default到泰伦东的

def make_first_persona_default 
    unless self.update_attribute(:default_persona_id, self.personas.first.id) 
     raise "got an error trying to save persona: #{self.errors.inspect}" 
    end 
    end 

default_persona_id仍然是零

User Load (1.0ms) SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT 1 
=> #<User id: 13, email: "[FILTERED]", encrypted_password: "[FILTERED]", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 1, current_sign_in_at: "2013-10-01 02:09:19", last_sign_in_at: "2013-10-01 02:09:19", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", created_at: "2013-10-01 02:09:19", updated_at: "2013-10-01 02:09:19", default_persona_id: nil> 

这里是我的,用户模式。

create_table "users", force: true do |t| 
    t.string "email",     default: "", null: false 
    t.string "encrypted_password",  default: "", null: false 
    t.string "reset_password_token" 
    t.datetime "reset_password_sent_at" 
    t.datetime "remember_created_at" 
    t.integer "sign_in_count",   default: 0, null: false 
    t.datetime "current_sign_in_at" 
    t.datetime "last_sign_in_at" 
    t.string "current_sign_in_ip" 
    t.string "last_sign_in_ip" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    t.integer "default_persona_id" 
    end 

和我用来添加default_persona_id列的迁移。

class AddActivePersonaToUsers < ActiveRecord::Migration 
    def change 
    change_table :users do |t| 
     t.integer :default_persona_id 
    end 
    end 
end 

回答

2

我不知道这条线在User模型做:

attr_accessor :name, :default_persona_id 

您的意思是accessible?以这种方式创建访问器将覆盖ActiveRecord访问器,因此分配default_persona_id将仅设置实例变量@default_persona_id,并且对数据库不起作用。

+0

啊!让我试试这个。 –

+0

这就是问题所在! –

1

在现实中 - 我们没有理由失去语境。 此外 - 而不是创建一个,然后将自己添加为相关用户 - 您可以直接在关联上创建角色,并自动链接自己。

我会做这种方式:

private 
    def create_first_persona 
    persona = self.personas.build(:name => self.name) 
    if persona.save! 
     self.update_attribute(:default_persona_id, persona.id) 
    end 
    end 

如果您希望继续使用这两种方法的方式,构建将与帮助。 我怀疑你原来的代码中的问题是你没有建立在关联上 - 因此在用户找到新的角色之前需要重新加载“角色” 。

此外,您不需要按照您的方式取出当前用户..您已拥有自己,因此只需使用self。例如:

def make_first_persona_default 
    self.default_persona_id = self.personas.first.id 
    self.save!(:validate => false) 
    end 

,甚至更好,你只设置一个属性...所以使用更新属性

def make_first_persona_default 
    self.update_attribute(:default_persona_id, self.personas.first.id) 
    end 
+0

由于@persona正在保存第一个片段没有收到任何错误。我想你想测试self.update_attributes? –

+0

更新我的问题以包含更多信息。顺便说一句,是update_attributes将绕过名称验证? –

+0

不可以。但是到了这个时候,您已经运行并完成了“创建”,因此它应该已经有效。如果它无效 - 在进入after_create钩子之前代码会失败。 –