2014-11-09 4 views
1

Я стараюсь понять отношения, которые owner = create(:user, device_token: device_token) должен owner: {device_token: device_token}, я обычно использую user_id для этой ассоциации. 2. Что такое метод device_token в контроллере.Rails Ассоциации Rspec

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 

конец

Controller Код:

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 

ответ

0

Там есть несколько способов, вы можете определить однозначно идентифицировать запись в базе данных. Использование поля id является наиболее распространенным, но если у вас есть другой способ однозначно идентифицировать пользователя, вы также можете использовать его. Обычно вы не показываете пользователю, что их идентификационный номер находится в базе данных. Но, если вы хотите дать им возможность однозначно идентифицировать себя, вы можете создать другое поле, уникальное для каждого пользователя - например, membership_number или подобное. Кажется, что в вашем случае device_token - это поле, которое однозначно идентифицирует пользователя.

Таким образом, база данных заботятся о user_id поле - это то, что он использует для связывания Event к определенному User (он же, владельцу). Если ваши пользователи знали свой идентификатор, тогда они могли бы пройти в этом, а не в их device_token, и все будет хорошо. Но они этого не знают.

Итак, они проходят в их devise_token. Вы используете это для извлечения пользователя из базы данных, а затем знаете этот идентификатор пользователя. Затем вы можете сохранить этот идентификатор пользователя в поле 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 установлен правильно.

UPDATE ПОСЛЕ ВАШЕЙ COMMENT:

device_token в настоящее время передается в качестве параметра. Это также имя поля в модели пользователя. Таким образом, одна строка в таблице пользователя может выглядеть следующим образом:

ID: 24, first_name: Фреда last_name: Flintstone, device_token: 123abc, адрес: коренные породы и т.д.

метод:

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 из параметров, передаваемых в этот метод в основном говорит: Посмотрите в Params хэш при значении внутри ключа owner , Посмотрите, содержит ли ключ ownerdevice_token. Если это так, верните это значение device_token, и если он не вернет nil. Он делает это с использованием метода try, который вы можете прочитать здесь: http://apidock.com/rails/Object/try

+0

Спасибо, сэр, а что такое метод «токена устройства»? Чтобы уточнить API для приложения iOS, он использует уникальный токен устройства, чтобы определить, что это правильное пользовательское и пользовательское устройство. Где оно вызывается в контроллере? Синтаксис также немного неясен в рамках метода. Понятно, что свойство params [owner] передается в метод «dev-token», но не уверен, что он перенастраивает. – ideahed

 Смежные вопросы

  • Нет связанных вопросов^_^