我正在努力理解
owner = create(:user, device_token: device_token)
与 owner: {device_token: device_token}
之间的关系,我通常使用 user_id
来表示这种关联。
2.控制器中的device_token
方法是做什么的。
describe 'POST /v1/events' do
it 'saves the address, lat, lon, name, and started_at date' do
date = Time.zone.now
device_token = '123abcd456xyz'
owner = create(:user, device_token: device_token)
post '/v1/events', {
address: '123 Example St.',
ended_at: date,
lat: 1.0,
lon: 1.0,
name: 'Fun Place!!',
started_at: date,
owner: {
device_token: device_token
}
}.to_json, { 'Content-Type' => 'application/json' }
event = Event.last
expect(response_json).to eq({ 'id' => event.id })
expect(event.address).to eq '123 Example St.'
expect(event.ended_at.to_i).to eq date.to_i
expect(event.lat).to eq 1.0
expect(event.lon).to eq 1.0
expect(event.name).to eq 'Fun Place!!'
expect(event.started_at.to_i).to eq date.to_i
expect(event.owner).to eq owner
end
end
控制器代码:
def create
@event = Event.new(event_params)
if @event.save
render
end
end
private
def event_params
{
address: params[:address],
ended_at: params[:ended_at],
lat: params[:lat],
lon: params[:lon],
name: params[:name],
started_at: params[:started_at],
owner: user
}
end
def user
User.find_or_create_by(device_token: device_token)
end
def device_token
params[:owner].try(:[], :device_token)
end
end
您可以通过多种方法来唯一标识数据库中的记录。使用
id
字段是最常见的 - 但如果您有其他方法来唯一标识用户,那么您也可以使用它。通常,您不会向用户显示他们在数据库中的 ID 号。但是,如果您想为他们提供一种唯一标识自己的方式,您可以创建另一个对于每个用户来说都是唯一的字段 - 例如 membership_number
或类似的字段。在您的情况下,device_token
似乎是唯一标识用户的字段。
因此,您的数据库关心
user_id
字段 - 这就是它用来将 Event
绑定到特定 User
(又名所有者)的字段。如果您的用户知道他们的 ID,那么他们可以传入该 ID,而不是他们的 device_token
,一切都会好起来的。但他们不知道。
因此,他们传递了他们的
devise_token
。您可以使用它从数据库中获取用户,然后您就知道该用户的 ID。然后,您可以将该用户的 ID 存储在您的 user_id
模型的 Event
字段中。
def user
User.find_or_create_by(device_token: device_token)
end
此方法是基于
devise_token
获取用户的方法。然后这个方法:
def event_params
{
address: params[:address],
ended_at: params[:ended_at],
lat: params[:lat],
lon: params[:lon],
name: params[:name],
started_at: params[:started_at],
owner: user
}
end
特别是,行:
owner: user
调用上面的方法。从那时起,Rails 会在后台处理它并确保您的 user_id 设置正确。
发表评论后更新:
device_token
作为参数传入。它也是用户模型中字段的名称。因此,用户表中的一行可能如下所示:
id:24,名字:fred,姓氏:flintstone,device_token:123abc,地址:bedrock 等
方法:
def user
User.find_or_create_by(device_token: device_token)
end
的意思是:转到数据库中的 User 表,尝试查找具有
device_token
且具有作为参数传入的值的 User,如果找不到,则创建一个。
因此,在这一行中:
User.find_or_create_by(device_token: device_token)
,对 device_token
的第一个引用是哈希的键,它引用了用户模型中名为 device_token
的字段。
对
device_token
的第二次引用是对该方法的调用:
def device_token
params[:owner].try(:[], :device_token)
end
从传入的参数中获取
device_token
。该方法基本上表示:在 params 哈希中查找 owner
键内的值。查看 owner
键是否包含 device_token
。如果是,则返回 device_token
,如果不返回 nil
。它使用 try
方法来执行此操作,您可以在此处阅读有关该方法的更多信息:http://apidock.com/rails/Object/try