当我传递属于它的用户时,为什么我的DataMapper记录不会保存?

时间:2016-05-08 17:35:34

标签: ruby sinatra datamapper

我已经使用DataMapper和Sinatra建立了一个简单的has-many和belongs-to关联。我的用户模型有很多'偷看',我的Peep模型属于用户。请参阅下面的课程....

我能够通过在初始化时将user_id直接传递给窥视来成功创建属于特定用户的新窥视,如下所示:

方法1

new_peep = Peep.create(content: params[:content], user_id: current_user.id)

这会将Peep加1到Peep.count。

但是,我的理解是我应该能够通过将current_user分配给new_peep.user来创建关联。但是当我尝试时,窥视对象将无法保存。

我试过这个:

方法2

new_peep = Peep.create(content: params[:content], user: current_user)

此处的当前用户是User.get(会话[:current_user_id])

生成的new_peep的id为nil,但 将user_id设置为current_user的id。 New_peep看起来与使用方法1成功创建的new_peep完全相同,不过它没有id,因为它没有成功保存。我试过分别调用new_peep.save,但我仍然得到以下窥视对象:

<Peep @id=nil @content="This is a test peep" @created_at=#<DateTime: 2016-05-08T12:42:52+01:00 ((2457517j,42172s,0n),+3600s,2299161j)> @user_id=1>, @errors={}

请注意,没有验证错误。其他人似乎对保存记录的大多数问题都归结为无法满足的验证标准。

我认为这与belongs_to关联不起作用有关,但我可以(在使用上面的方法1创建new_peep之后)仍然调用new_peep.user并访问正确的用户。所以在我看来,belongs_to作为一个读者而不是一个制定者。

这个问题也意味着我无法通过在user.peeps集合中添加一个然后保存用户来创建窥视,这意味着窥视属于用户几乎没有任何意义。

我见过其他人在保存没有任何保存更改的记录方面遇到了问题 - 但这是一个全新的记录,所以它的所有属性都在更新。

我真的很想知道发生了什么 - 这让我困惑了太久了!

以下是我的课程:

class Peep

    include DataMapper::Resource

    property :id, Serial
    property :content, Text
    property :created_at, DateTime

    belongs_to :user, required: false

    def created_at_formatted
        created_at.strftime("%H:%M, %A %-d %b %Y")
    end

end


class User

    include DataMapper::Resource
    include BCrypt

    attr_accessor :password_confirmation
    attr_reader :password

    property :id, Serial
    property :email, String, unique: true, required: true
    property :username, String, unique: true, required: true
    property :name, String
    property :password_hash, Text

    def self.authenticate(params)
        user = first(email: params[:email])
        if user && Password.new(user.password_hash) == params[:password]
            user
        else
            false
        end
    end

    def password=(actual_password)
        @password = actual_password
        self.password_hash = Password.create(actual_password)
    end

    validates_confirmation_of :password
    validates_presence_of :password

    has n, :peeps

end

1 个答案:

答案 0 :(得分:0)

当您创建Peep时,您不能通过User创建它,也许这就是它没有主ID的原因,因为它属于User。此外,您还要为其分配外键user_id,就好像您有一个如此定义的属性一样。虽然数据库有它,但是在DataMapper中你不会传入外键id,它会为你做。

尝试替换

new_peep = Peep.create(content: params[:content], user: current_user)

with:

new_peep = current_user.peeps.create(content: params[:content], created_at: Time.now)