Rails 协会 Rspec

问题描述 投票:0回答:1

我正在努力理解

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
ios ruby-on-rails rspec devicetoken
1个回答
0
投票

您可以通过多种方法来唯一标识数据库中的记录。使用

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

© www.soinside.com 2019 - 2024. All rights reserved.