【问题标题】:Rails Associations RspecRails 协会 Rspec
【发布时间】:2015-01-06 03:52:04
【问题描述】:

我很难理解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

结束

控制器代码:

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 api rspec devicetoken


    【解决方案1】:

    您可以通过多种方式来唯一标识数据库中的记录。使用id 字段是最常见的——但如果您有另一种唯一标识用户的方法,那么您也可以使用它。通常,您不会向用户显示他们在数据库中的 ID 号。但是,如果您想为他们提供一种唯一标识自己的方式,您可以创建另一个对每个用户都是唯一的字段 - 例如 membership_number 或类似名称。在您的情况下,device_token 似乎是一个唯一标识用户的字段。

    因此,您的数据库关心user_id 字段——它用于将Event 绑定到特定的User(又名所有者)。如果您的用户知道他们的 id,那么他们可以传递那个,而不是他们的device_token,一切都会好起来的。但他们不知道。

    所以,他们传递了他们的devise_token。您使用它从数据库中获取用户,然后您知道该用户的 ID。然后,您可以将该用户的 ID 存储在您的 Event 模型的 user_id 字段中。

    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 作为参数传入。它也是 User 模型中字段的名称。因此,用户表中的单行可能如下所示:

    id:24,first_name:fred,last_name:flintstone,device_token:123abc,地址:bedrock 等

    方法:

    def user
      User.find_or_create_by(device_token: device_token)
    end
    

    是说:去数据库中的用户表,尝试找到一个用户,它有一个device_token,它的值是作为参数传入的,如果找不到,则创建一个.

    所以在这一行中: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。这个方法基本上是说:在owner键内的值处查看params哈希。查看owner 键是否包含device_token。如果是,则返回 device_token,如果不返回 nil。它使用try 方法执行此操作,您可以在此处阅读更多信息:http://apidock.com/rails/Object/try

    【讨论】:

    • 谢谢先生,device token 方法在做什么?为了进一步澄清 API 是针对 iOS 应用程序的,因此它使用唯一的设备令牌来确定它是正确的用户和用户设备。它在控制器中被调用到哪里?该方法中的语法也有点不清楚。清楚的是 params[owner] 属性被传递到 devise-token 方法中,但不确定它正在重新调整什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多