рубин на рельсах мне нужно построить объект из данных API - PullRequest
0 голосов
/ 22 февраля 2019

Я хочу создать объект из API данных.Сначала пользователь должен будет ввести свой номер имитации.Как только регистрация наберет его, верните следующие данные в представлении show

vehicle_controller:

   @vehicle = Vehicle.new
   @vehicles = []
    vehicle_number = params['immatricule'].capitalize
    vehicles.each do |vehicule|
    data_api = CarRegistrationFrance.Lookup(#{"vehicle_number"},"username","password")

Api_data response:

 => {"Description"=>"RENAULT CLIO IV", "RegistrationYear"=>"2017", "CarMake"=>{"CurrentTextValue"=>"RENAULT"}, "CarModel"=>{"CurrentTextValue"=>"CLIO IV"}, "EngineSize"=>{"CurrentTextValue"=>"4"}, "FuelType"=>{"CurrentTextValue"=>"DIESEL"}, "MakeDescription"=>{"CurrentTextValue"=>"RENAULT"}, "ModelDescription"=>{"CurrentTextValue"=>"CLIO IV"}, "Immobiliser"=>{"CurrentTextValue"=>""}, "IndicativeValue"=>{"CurrentTextValue"=>0}, "DriverSide"=>{"CurrentTextValue"=>""}, "BodyStyle"=>{"CurrentTextValue"=>"BERLINE 5 PORTES"}, "RegistrationDate"=>"2017-10-30","ExtendedData"=>{"anneeSortie"=>"2017", "boiteDeVitesse"=>"", "carburantVersion"=>"D", "carrosserieVersion"=>"", "classeSra"=>"K", "libVersion"=>"1.5 DCI 90 EDITION ONE EDC", "libelleModele"=>"CLIO IV", "marque"=>"RE", "modele"=>"88", "produit"=>"", "puissance"=>"4", "version"=>"", "cleCarrosserie"=>"", "groupeSra"=>"30", "nbPlace"=>"5", "datePremiereMiseCirculation"=>"30102017", "questionBatterie"=>"", "electrique"=>"", "genre"=>"", "typeVehicule"=>"", "numSerieMoteur"=>"VF15RBJ0D58888591", "valeurANeufSRA"=>"", "niveauRisqueVol"=>"", "protectionConstructeur"=>"", "puissanceDyn"=>"", "segmentVeh"=>""}} 
    @vehicles << data_api
    vehicle.description => data_api["Description"]
    vehicle.annee => data_api["RegistrationYear"]


    def vehicle_params
  params.require(:voiture).permit(:immatricule, :description, :annee)
end

Как только пользователь введет свои регистрационные номера, я хочу присоединиться к

data_api ["Description"] << vehicle ["description"]

attachданные атрибута объекта транспортного средства

data_api ["RegistrationYear"] << vehicle ["year"]

/ user [: id] / vehicle / new его пример

<%= form_tag("/vehicle", method: "post") do %>
  <%= label_tag(:immatricule, "") %>
  <%= text_field_tag(:immatricule) %>
  <%= submit_tag("create") %>

/ user [: id] / vehicle / showэто пример

<%= @vehicle.api_data["Description"] %>
<%= @vehicle.api_data["RegistrationYear"] %>
  1. введите свой номер immatricule
  2. post immatricule пользователя транспортного средства для api_data
  3. создать объект транспортного средства из ответа api_data
  4. render show view

Я пробовал несколько операций, но не могу найти решение.

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

привет. Спасибо за вашу помощь

я использую устройство для аутентификации пользователя

моя база данных shemas:

  create_table "users", force: :cascade do |t|
t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false
t.float "longitude"
t.float "latitude"
t.string "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.integer "sign_in_count", default: 0, null: false
t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at"
t.inet "current_sign_in_ip"
t.inet "last_sign_in_ip"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "username"
t.string "avatar_file_name"
t.string "avatar_content_type"
t.bigint "avatar_file_size"
t.datetime "avatar_updated_at"
t.index ["email"], name: "index_users_on_email", unique: true
t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true


 end

  create_table "vehicles", force: :cascade do |t|
    t.string "immatricule"
    t.string "description"
    t.string "marque"
    t.string "date_circulation"
    t.string "fuel_type"
    t.bigint "user_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["user_id"], name: "index_vehicles_on_user_id"
  end

  add_foreign_key "vehicles", "users"

пользователи моей модели:

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable, :trackable
         has_many :vehicles

машины моей модели:

class Vehicle < ApplicationRecord
  belongs_to :user
end

мне нужны следующие маршруты:

   user_vehicles GET    /users/:user_id/vehicles(.:format)                                                       vehicles#index
                           POST   /users/:user_id/vehicles(.:format)                                                       vehicles#create
          new_user_vehicle GET    /users/:user_id/vehicles/new(.:format)                                                   vehicles#new
         edit_user_vehicle GET    /users/:user_id/vehicles/:id/edit(.:format)                                              vehicles#edit
              user_vehicle GET    /users/:user_id/vehicles/:id(.:format)                                                   vehicles#show
                           PATCH  /users/:user_id/vehicles/:id(.:format)                                                   vehicles#update
                           PUT    /users/:user_id/vehicles/:id(.:format)                                                   vehicles#update
                           DELETE /users/:user_id/vehicles/:id(.:format)                                                   vehicles#destroy

но я использую в своем контроллере devise

, мне нужно строить машины сapi ответ Мне нужно сохранить данные в моей базе данных из числа immatricule в форме новых транспортных средств, которые пользователи вводят number_immatricule "immatricule" = формировать новые транспортные средства [: immatricule] формы для пользователей get data_api

def build_vehicle_user_from_api_data
"description" == data_api["description"]
 "marque" == data_api["CarMake"]
"date_circulation" == data_api["RegistrationDate"]
 "fuel_type" == data_api["fuel_type"]
end

Я ищу какчтобы сделать это в моем контроле пользователей или транспортных средств

0 голосов
/ 22 февраля 2019

Таким образом, вы чувствуете, что вы исходите из прошлого, не будучи CRUD (Create, Read, Update, Delete) осведомленным ... основываясь на том, что вы не перечислили контроллеры и т. Д., Над которыми вы работаете, чтобы добиться этого (крайне важно для любого ответа наответьте на свой вопрос).

Основываясь на статусе вопроса 2/22 @ 06:18 am -600 вот несколько быстрых заметок ...

Вы захотите пройти эту прогулку-по началу работы - RailsGuides .

Во-вторых, я думаю, что из вашего URL, который вы перечислили - у вас есть вложенный маршрут и вы используете соответствующую вложенную модель.Ответ изменяет, какой контроллер / действие / маршрутизацию я предлагаю - поэтому обязательно уточните, если вы не понимаете, прежде чем пытаться понять этот ответ ...

Все это - работа предположения, поскольку тамэто детали вашей реализации, которые нам не хватает (файл route.rb, если это скрипт, который вы, как администратор, вызываете, или каждый пользователь запускает обновление самостоятельно, если это вообще работает).


Когда закончите, вопрос, который вы хотели задать, должен быть ...

«Какой контроллер и действие контроллера я должен использовать для обновления регистрационной информации?»(Обычно обозначается как controller#action)

Ответ CRUD - это update (rails называет его Edit для отображения представления и update для выполнения).

Причина, по которой ваш вопрос сбивает людей с толку, заключается в том, что в Rails Way (CRUD) уже есть базовый код для контроллера и действие для этого действия контроллера по обновлению поля.Вам не нужно создавать объект самостоятельно - все объекты данных, которые являются постоянными, должны быть объектами модели Rails.

В вашем случае модель Vehicle в app/models/vehicle.rb была бы моей догадкой.Вы можете выбрать для этого маршрут в файле config/routes.rb как ...

Rails.application.routes.draw do
  resources :users do
    resources :vehicle
  ...

, что даст вам маршрут / URL-адрес "/{:user_id}/{:vehicle_id}/{controller action}".

Это предполагает...

  1. Пользователь, заходящий на ваше приложение в сети или сети
  2. Они регистрируются или в
  3. Отображают информацию из API (я неконечно, если вы хотите передать эту информацию обратно в этот API, и именно поэтому вам нужен объект - но при условии, что это не так)
  4. После того, как пользователь # show controller вытягивает модель транспортного средства, извлекает информацию из API
  5. Ваш контроллер перенаправит их на действие CRUD read (Rails называет это Show).Это также уже закодировано в действии контроллера для обновления.

В вашем случае это, вероятно, будет ... User#show, что будет accepts_nested_attributes_for :RegistrationYear и, возможно, :Description в User модель, ссылаясь на поля в Vehicle модели, с которой вы уже работаете.


Для другого случая ... вы просто оборачиваете другой API, который обновляется, и ваше rails-приложение не 'не удерживать что-либо ...

Вам нужна пользовательская сущность или аутентификация ... возможно, вы получаете omni_auth или другой токен для входа в систему безопасности из API, на который вы ссылались ... так что ваши шаги ...

  1. Либо войдите в систему, либо вы создадите / войдите в систему пользователя
  2. Ваш User#Show должен иметь ссылку на Vehicle#Update, либо представление User#Show должно включать эту форму с полем сидентификаторы пользователя и транспортного средства ... которые заполняются уже после того, как контроллер выполнил этот запрос API, извлекают всю информацию и имеют два обновляемых поля.
  3. Кнопка отправки должна быть в обычном режиме.rails app будет ссылкой на другое действие контроллера #, которое будет просто выполнять интерфейс обновления API вместо того, чтобы сохранять информацию в вашу собственную базу данных ... хотя вы могли бы легко поместить этот вызов интерфейса API в controller#action, отвечающий за отображение формы.

Я предлагаю вам сделать стандартный объектный файл, если вы просто оборачиваете API своим собственным приложением rails ...

# depending on where you put this you might need to load it yourself
app/lib/other_api_connection.rb  

# rails prefers this format as part of ruby & it's class autoloading
class OtherAPI < CarRegistrationFrance
  attr_accessor :registration, :description


  def initialize(search_immat, user, pass, api_url = {whatever currently})
    ...
    @user = user 
    @pass = pass 
    @record = look_up
    @api_url = api_url 
  end

  def look_up(search_immat)
    ... 
    Lookup("#{search_immat}", @user, @pass)
  end

  def update_api
    begin
      ... {you haven't shown us the update API url} ...
    rescue {some error from api}
      return "{some error message}"
    end
  end
end

Итак ... у вас есть обработчик APIобъект сейчас ...

Для использования вы вызываете его в контроллере # action ... скажем User # Show, который отправляет перенаправления на User#Update или Vehicle#Update

class Vehicle < ActionController::Base
  ...

  def update
    ... 

    # normal stuff probably needs to be deleted if you aren't saving to your application db THEN updating API (aka just wrapping an API - which I'm assuming you are doing since you haven't said otherwise & it's less work).
    # also you could pass the object as a parameter in the submit link - but that's not really CRUD per say
    @user = {whatever user is}
    api = OtherAPI.new(user, pass)

    # you might have to permit this as parameter to pull it out
    @response_code = api.update_api(:RegistrationYear, :Description) # or whole vehicle record if the API requires

    if @response_code == {whatever valid code is from that API documentation}
      format.html { redirect_to @vehicle, notice: 'Vehicle was successfully updated.' }
    else
      format.html { render :edit }
      format.json { render json: @vehicle.errors, status: :unprocessable_entity }
  end
  ... rest of controller actions
end

Примечание. Я предложил создать класс / объект интерфейса API, потому что вы можете затем вызывать код из контроллера или из действия и вносить изменения только в одном месте, если изменился URL-адрес API и т. Д ..., но ...вам может потребоваться include OtherAPI вверху каждого кода контроллера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...