调用其方法时,如何填充某些模型属性?

时间:2013-12-09 05:34:46

标签: ruby-on-rails

这是一个描述我的UserFriendship模型的模型,该模型的属性用于在两个朋友用户之间创建连接表。

class UserFriendship < ActiveRecord::Base


    #attributes: ["id", "friend_id", "user_id", "created_at", "updated_at", "state"]

    belongs_to :user
    belongs_to :friend, class_name: 'User', foreign_key: 'friend_id'

    def send_accept_email
        UserNotifier.friend_accepted(id).deliver    
    end

end

现在我关注的一件事是id方法中的send_accept_email变量。我只是不知道它意味着什么或我如何改变它。

我有一个model_spec来测试这个模型(使用rspec):

it "should send a friend_accepted email" do
        @user_1 = FactoryGirl.create(:user_with_all_valid)
        @user_2 = FactoryGirl.create(:user_with_all_valid_two)

        # much prefer " user_id: @user_1.id " to 'magic' "user: @user_1"

        @user_friendship = UserFriendship.create user_id: @user_1.id, friend_id: @user_2.id

       expect{@user_friendship.send_accept_email}.to change{ActionMailer::Base.deliveries.size}.from(0).to(1)
end

它通过了,所以动作制作者发送电子邮件好了。但我只是不明白该规范如何用{1}填充id变量。

如果我想在状态机上使用此方法,并希望将send_accept_email发送给规范之外的用户,我当然必须更改此方法以传递参数:

    def send_accept_email(specified_id)
            UserNotifier.friend_accepted(specified_id).deliver  
    end

并将其称为:

    UserFriendship.send_accept_email(76)

或者它是否与此有关(如何在规范中实际调用):

@user_friendship.send_accept_email

该方法链接到UserFriendship类的实例的方式。执行此操作时,如果调用id(或任何其他模型方法),模型中的send_accept_email变量是否会自动填充?其他模型属性是否也自动填充,因此我将friend_iduser_idcreated_atupdated_atstate等变量都设置为{{我称之为1}}的属性:

@user_friendship

有人可以慢慢解释一下吗?

2 个答案:

答案 0 :(得分:1)

id是UserFriendship表中记录的ID。

您不能使用UserFriendship.send_accept_email,因为它是实例方法而不是类方法。因此,您必须在模型的实例(UserFriendship对象)上调用它。

id是自动填充的,因为它被解释为self.id。因此,如果您的一个UserFriendship对象看起来像 实例方法中的<#UserFriendship id:100, user_id:131, friend_id:213, created_at:...>self.id或仅id将返回100

希望我明白了。

答案 1 :(得分:0)

当你问

时,

akagr是正确的

  

现在我关注的一件事是send_accept_email方法中的id变量。我只是不知道它意味着什么或我如何改变它。

id是UserFriendship实例的id。您没有向我们展示的是UserNotifier.friend_accepted(id)以及它对UserFriendShip实例的ID的作用。

希望它使用user_id来查找相应用户的电子邮件地址。如果用户使用传递给friend_accepted的ID查找用户,则会找到错误的用户。