不带 nil 传递参数

Passing params without nil

我想将表单的值传递给控制器​​,该控制器应调用模型中的方法来搜索产品。

我想传递 category_id 和用户在 textfield 处写入的字符串。
我什至会将参数的空白值传递给模型(如果用户没有在搜索栏上写东西或选择 none 类别)
我什至想保存模型中的空白值,SQL 空白变量需要 "all" 东西。 这是一个很好的原因,如果参数中有东西,SQL 会找到那个东西,但是如果参数中没有东西,SQL 将获取所有产品。

我无法在变量中保存参数的值,因为如果参数为空,它 returns 给我这个错误:

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

试试这个:

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

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

您可以通过定义方法来获取类别参数,

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

@Vito,更改控制器中的行 -> @category = params[:category][:name] by

@category = params[:category].present? ?参数[:类别][:名称]

问题是当您不 select 类别时,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 行出现的位置: “”的未定义方法“名称”:字符串

提取的源代码(大约第 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作为变量名的事实 也许观点因此而变得混乱 我在@cat 中调用@category,问题消失了

但是,现在的问题是,如果我在变量@cat 中传递“”,SQL 查询不会return 所有类别 我怎样才能得到查询的所有结果?与 %% 一样有效,但与 category_id = "" 没有。为什么?

我post为其他人修复的代码:

在控制器中:

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

最后 POST:

问题已解决:

在控制器中

    @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 注入的影响吗?

谢谢大家:) 我希望这个解决方案会对某人有所帮助。