没有零通过params

时间:2015-05-14 22:24:39

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 search params

我想将表单的值传递给Controller,Controller应该从Model中调用方法来搜索产品。

我想传递NSData和用户在category_id处写的字符串 我会将模型的空白值传递给模型(如果用户没有在搜索栏上写东西或选择任何类别) 我想保存模型中的空白值原因,SQL空白变量采取" all"的东西。 这是一个很好的原因,如果params中有东西,SQL会找到那个东西,但是如果params中没有任何内容,那么SQL将会占用所有产品。

我无法在varibiles中保存params的值,因为如果params为空它会返回给我这个错误:

未定义的方法`[]'为零:NilClass

我希望你了解我以及我想做什么。 换句话说,我想使用一个简单的赋值将值(甚至是空值)传递给模型来进行SQL查询。在一次代码拍摄中,我想编写两种情况。

这是我的代码。

在我的控制器中:

...

textfield

...

在我的模型中:

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

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

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

6 个答案:

答案 0 :(得分:1)

您可以通过定义类似

的方法来获取类别参数
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

答案 1 :(得分:0)

试试这个:

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

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

答案 2 :(得分:0)

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

@category = params [:category] ​​.present? ? PARAMS [:类别] [:名称]

问题是当你没有选择类别时,params [:category]变为nil并且你从params [:category]获取名称,这就是为什么错误“未定义的方法`[]'为nil:NilClass”即将来临

希望这能解决您的问题。

答案 3 :(得分:0)

我还有问题,因为我写的时候

    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行引发: undefined方法`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>
这是什么?

答案 4 :(得分:0)

好的,我解决了这个问题 (我认为)是因为我使用@category作为变量名 也许这个观点让人感到困惑 我在@cat中调用@category,问题就消失了

但是,现在的问题是如果我通过&#34;&#34;那么SQL查询不会返回所有类别。在变量@cat中 我如何获得查询的所有结果?和%%一样,但它有效 category_id =&#34;&#34;没有。为什么呢?

我发布了为其他人修复的代码:

在控制器中:

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

答案 5 :(得分:0)

最后一次发布:

问题修复:

在控制器

    @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注入?

所有:) 我希望这个解决方案可以帮助别人。