Как разрешить неинициализированную константу Search :: error - PullRequest
0 голосов
/ 07 апреля 2019

Я создаю расширенный поиск / фильтр для моей модели назначений, связанной с техническим обслуживанием автомобилей, где таблицы в schema.rb для каждой из них:

  create_table "appointments", force: :cascade do |t|
    t.string "VIN"
    t.string "owner_email"
    t.string "date"
    t.string "time"
    t.string "reason"
    t.string "parts_needed"
    t.string "hours_needed"
    t.string "cost"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "searches", force: :cascade do |t|
    t.string "VIN"
    t.string "email"
    t.string "after_date"
    t.string "before_date"
    t.string "time"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

В моей модели search.rb я определяю функцию поиска:

class Search < ApplicationRecord

    def search_appointments
        appointments = Appointment.all
        # appointments = appointments.where("VIN LIKE ?", VIN) if VIN.present? GIVES ERROR
        appointments = appointments.where("owner_email LIKE ?", email) if email.present?
        appointments = appointments.where("date >= ?", after_date) if after_date.present?
        appointments = appointments.where("date <= ?", before_date) if before_date.present?
        if !time=="Any"
            appointments = appointments.where("time LIKE ?", time) if time.present?
        end

        return appointments
    end
end

И тогда в моем show.html.erb отобразится результирующий фильтр:

<h2 align="center">Search Results</h2>
</br>


<div class="container-fluid">
    <% if @search.search_appointments.empty? %>
        <p> No Appointments Fit This Search</p>

    <% else %>
        <%= @search.search_appointments.each do |a| %>

        Email: <%= a.owner_email%> </br>
        Date: <%= a.date%> </br>
        Time: <%= a.time%> </br>
        VIN: <%= a.VIN %> </br>

        </br>
        </br>
        </br>
        <% end %>
    <% end %>
    </br>
    <%= link_to 'Return', @search, method: :delete %>
</div>

Все работает хорошо, за исключением первой попытки фильтра в модели search.rb, закомментированной строки. Если я раскомментирую строку и запускаю поиск, эта строка подсвечивается, и я получаю сообщение об ошибке:

uninitialized constant Search::VIN

Я не понимаю, почему это происходит, поскольку все остальные фильтры работают просто отлично. Буду признателен за любые предложения, спасибо.

Контроллер поиска:

class SearchesController < ApplicationController

    def new
        @search = Search.new
    end

    def create
        @search = Search.create(search_params)
        redirect_to @search
    end

    def show
        @search = Search.find(params[:id])
    end

    def destroy
        @search = Search.find(params[:id])
        @search.destroy

        redirect_to admin_path
    end

    def search_params
        params.require(:search).permit(:VIN, :email, :after_date, :before_date, :time)
    end
end

Где моя «новая» страница - это форма, в которой пользователь заполняет параметры фильтра и затем нажимает кнопку «Отправить», чтобы перенести их на страницу показа, на которой перечислены отфильтрованные встречи.

1 Ответ

2 голосов
/ 07 апреля 2019

Когда вы ссылаетесь на VIN в appointments.where("VIN LIKE ?", VIN), ruby ​​ищет константу, потому что она прописная. Чтобы получить доступ к вашему атрибуту, вам нужно указать self.VIN или изменить имя столбца на строчные (рекомендуется).

Вариант 1: appointments = appointments.where("VIN LIKE ?", self.VIN) if self.VIN.present?

Вариант 2:

  • Измените столбец VIN на vin
  • appointments = appointments.where("vin LIKE ?", vin) if vin.present?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...