这是一个描述我的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_id
,user_id
,created_at
,updated_at
,state
等变量都设置为{{我称之为1}}的属性:
@user_friendship
有人可以慢慢解释一下吗?
答案 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查找用户,则会找到错误的用户。