Проходящие парамы без нуля


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

Я хочу передать category_id и строку, которую пользователь записывает в textfield.
Я бы передал в модель даже пустое значение params (если пользователь не пишет что-то в строке поиска или не выбирает категорию none)
Я хочу сохранить даже пустое значение причины в модели, SQL пустой переменной взять "все" вещи. И это хорошая причина, если есть что-то в парах , SQL найдет эту вещь, но если в парах ничего нет, SQL возьмет все продукты.

Я не могу сохранить значение params в varibiles, потому что если params пуст, он возвращает мне эту ошибку:

Неопределенный метод '[] ' для nil:NilClass

Я надеюсь, что вы понимаете меня и то, что я хочу сделать. Другими словами, Я хочу использовать простое назначение для передачи значения (даже пустых значений) в модель для выполнения SQL-запроса. В одном кадре кода я хочу запрограммировать два случая.

Вот мой код.

В моем контроллере:

...

if params[:search]
    @search_name = params[:search]
end

if params[:category][:name]
    @category = params[:category][:name]
end 

@products = Product.search(@search_name,@category)

...

В моей модели:

def self.search(search_name,category)
    ricerca = Product.where("category_id = ? ",category)
    ricerca = ricerca.where("title like ? ", "%#{search_name}%") 
end
6   2   2015-05-15 01:24:39

6 ответов:

Вы можете получить параметры категории, определив такой метод, как

def category_params
  params.fetch(:category, {})
end

И, затем искать продукты по,

@search_name = params[:search]
@category = category_params[:name]
@products = Product.search(@search_name, @category)

На мой взгляд, если вы делаете прямой запрос на продукт, то вы должны сделать, как,

def product_params
  params.fetch(:product, {})
end

@category = product_params[:category_id]
@title = product_params[:title]
@products = Product.search(@category, @title)

И в модели продукта,

def self.search(category, title)
  where("category_id = ? AND title LIKE ?", category, "%#{title}%")
end

Попробуйте это:

@search_name = params[:search]
@category = (params[:category].blank? ? nil : params[:category][:name])

@products = Product.search(@search_name,@category)

@Vito, измените строку - > @ category = params [: category] [: name] в вашем контроллере на

@category = params [: category].настоящее? ? params [: категория] [: имя]

Проблема в том, что когда вы не выбираете категорию, то params[:category] приходит nil, и вы получаете имя из params[:category], поэтому появляется ошибка "undefined method `[]' for nil:NilClass".

Надеюсь, что это решит вашу проблему.

У меня все еще есть проблемы, потому что когда я писал

    if params[:category]
        @category = params[:category][:name]
    else
        @category = " "
    end

    if params[:search]
        @nome_ricerca = params[:search]
    else
        @nome_ricerca = " "
    end

    @products = Product.search(@nome_ricerca,@category)

У меня есть такая проблема:

Показ C:/Bitnami/depot/app/views/store/index.формат html.erb где линия #18 поднята: неопределенный метод 'name' для "": String

Извлеченный источник (вокруг строки #18):

 <p>
    <%= label_tag :search, 'Search:' %>
   <%= text_field_tag :search, params[:search] %>
    <%= collection_select :category, :name, Category.all, :id, :name, {:prompt => 'All Categories'} %>
   <%= submit_tag "Search", name: nil %>
 </p>

Что это такое?

Хорошо, я исправил проблему. это было (я думаю) относительно того, что я использовал @category в качестве имени переменной может быть, вид приходит в замешательство из-за этого я называю @ category в @cat, и проблема исчезает

Но теперь проблема в том, что SQL-запрос не возвращает всю категорию, если я передаю "" в переменной @cat Как я могу получить весь результат запроса? с like %% это работает, но с category_id = "" нет. почему?

Я вывешиваю код, исправленный для других:

В Контроллер:

if params[:category]
        @cat = params[:category][:name]
    else
        @cat = ''
    end


    if params[:search]
        @nome_ricerca = params[:search]
    else
        @nome_ricerca = ''
    end

    @products = Product.search(@nome_ricerca,@cat)

В модели:

def self.search(nome_ricerca,categoria)

    ricerca = Product.where("title like ? AND category_id = ? ", "%#{nome_ricerca}%",categoria) 
end

ПОСЛЕДНЕЕ СООБЩЕНИЕ:

ИСПРАВЛЕНА ПРОБЛЕМА:

В Контроллере

    @stringa_sql = ""

    if params[:search]
        @nome_ricerca = params[:search]
    else
        @nome_ricerca = ''
    end

    @stringa_sql = "title like "+"'%"+@nome_ricerca+"%'"

    if params[:category]
        if params[:category][:name] != ""
            @cat = params[:category][:name]
            @stringa_sql += " AND category_id = "+@cat
        else
            @cat = ''
        end
    end

    @products = Product.search(@stringa_sql)

В Модели:

def self.search(stringa_sql)
    ricerca = Product.where(stringa_sql) 

end

Вопрос: страдает ли это решение от SQL-инъекции ?

Спасибо всем :) Я надеюсь, что это решение кому-то поможет.