Мне нужна помощь, чтобы устранить ошибку отношения и список параметров во втором выборе, в соответствии со значением, введенным в первом выборе - PullRequest
0 голосов
/ 24 апреля 2019

Мне нужна помощь для устранения ошибки взаимосвязи и выбора параметров во втором выборе, в соответствии со значением, введенным в первом выборе

В консоли браузера возникает следующая ошибка при выборе первого «выбора».

get_communes? Selected_region = ATACAMA: 1 Не удалось загрузить ресурс: сервер ответил со статусом 401 (не авторизован)

Моя цель состоит в том, чтобы выбрать регион в первом выборе, а затем во втором выбрать параметры в этом регионе

Я работаю с ruby ​​на rails, javascript, jQuery, bootstrap

request.js

$(document).on("turbolinks:load", function() {


    //============ traer comuna de acuerdo a la region 
    $('#request_region').on('change', function (e) {
        var request_region = $('#request_region').find(":selected").text();
        $.ajax({
            url: '/requests/get_communes',
            type: 'get',
            data: {selected_region: request_region},
            success: function(data) {
                console.log('correcto!!');

                console.log(data);


                $("#request_commune").children().remove();
                var listitems = []; 
                $.each(data, function(key, value) { 
                    listitems += '<option value="' + value['id']+ '">' + value['name'] + '</option>'; 
                }); 
                $("#request_commune").append(listitems);
            }
        });
    });


    $(".js-example-basic-single").select2();

});

new.html.erb

            <div class="col-12 col-md-6">
                <%= f.select :region_id, @regions, {include_blank: 'Elija una región'}, {class: 'js-example-basic-single', id: :request_region, required: true} %>
                <%= f.label :Región, class:'' %>
            </div>


            <div class="col-12 col-md-6">

                    <span class="custom-dropdown last">
                        <select class="js-example-basic-single" id="request_commune" data-live-search="true" name="request[commune_id]"
                        required>
                        <option value="AL">Primero Elija una Región</option>
                    </select>
                    <%= f.label :comuna, class:'' %>

            </div>

папка: запросы (разработка) registrations_controller-гь

    def new
        @regions = Region.all.collect { |reg| [reg.name, reg.id] }
        super
    end


requests_controller.rb

class RequestsController < ApplicationController
  before_action :authenticate_request!
  before_action :set_request, only: [:show, :edit, :update] # probably want to keep using this

  # GET /users
  # GET /users.json
  def index
    @requests = Request.all
  end

  # # GET /users/1
  # # GET /users/1.json
  def show

  end

  # GET /users/1/edit
  def edit

  end

  # # PATCH/PUT /users/1
  # # PATCH/PUT /users/1.json
  def update
    respond_to do |format|
      if @request.update(request_params)
        format.html { redirect_to @request, notice: 'User was successfully updated.' }
        format.json { render :show, status: :ok, location: @request }
      else
        format.html { render :edit }
        format.json { render json: @request.errors, status: :unprocessable_entity }
      end
    end
  end

  #def dashboard
    #corregir este método
    #data_certificacion = Event.find_by(request: current_request)
    #byebug
    #if data_certificacion.present?
     # @certification = true
    #end
  #end


  def get_communes
        region = Region.find_by(name: params[:selected_region])
        @communes = Commune.order(name: :asc).where(region_id: region.id)
    render json: @communes
  end


  private
  # Use callbacks to share common setup or constraints between actions.
  def set_user
    @request = Request.find(params[:id])
  end

  # Never trust parameters from the scary internet, only allow the white list through.
  def user_params
    params.require(:request).permit(:role, :name)
  end

end

отношения и модели

region:
  has_many :communes

commune
  belongs_to :region
  has_many :requests

Schema:


  create_table "requests", force: :cascade do |t|
    t.string "email", default: "", null: false
    t.string "encrypted_password", default: "", null: false
    t.string "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.string "confirmation_token"
    t.datetime "confirmed_at"
    t.datetime "confirmation_sent_at"
    t.string "unconfirmed_email"
    t.integer "failed_attempts", default: 0, null: false
    t.string "unlock_token"
    t.datetime "locked_at"
    t.string "name"
    t.integer "phone"
    t.text "comment"
    t.boolean "state"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.bigint "region_id"
    t.bigint "commune_id"
    t.index ["commune_id"], name: "index_requests_on_commune_id"
    t.index ["email"], name: "index_requests_on_email", unique: true
    t.index ["region_id"], name: "index_requests_on_region_id"
    t.index ["reset_password_token"], name: "index_requests_on_reset_password_token", unique: true
  end


  create_table "regions", force: :cascade do |t|
    t.string "name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end


  create_table "communes", force: :cascade do |t|
    t.string "name"
    t.bigint "region_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["region_id"], name: "index_communes_on_region_id"
  end

Ответы [ 2 ]

0 голосов
/ 24 апреля 2019

Я думаю, что проблема у вас здесь before_action: authenticate_request!, я думаю, если вы удалите этот код из вашего контроллера, ваш get_communes вернет вам JSON!

"before_action: authenticate_request!" допускается использование только в AuthenticationController или ApplicationController!

0 голосов
/ 24 апреля 2019

Похоже, вам нужно сгенерировать и передать токен аутентификации в вызов ajax, например:

beforeSend: function (xhr) {
   xhr.setRequestHeader ("Authorization", token ));
},

Проверьте директиву beforeSend jQuery.

...