不带 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 注入的影响吗?
谢谢大家:)
我希望这个解决方案会对某人有所帮助。
我想将表单的值传递给控制器,该控制器应调用模型中的方法来搜索产品。
我想传递 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 注入的影响吗?
谢谢大家:) 我希望这个解决方案会对某人有所帮助。