【问题标题】:Creating a Rails' product page创建 Rails 的产品页面
【发布时间】:2014-11-08 18:47:09
【问题描述】:
我正在创建一个 Rails 电子商务网站。我可以使用搜索表单按标题搜索产品,但如何链接到输出具有特定标题或类别的所有产品的页面?
这是我的产品控制器中的代码:
def index
@products = Product.scoped
@products = @products.where('title like ?', "%#{params[:search]}%") if params[:search]
@products
end
我的商店控制器有这个:
def index
if params[:search]
@products = Product.search(params[:search]).title
else
@products= Product.all
end
end
【问题讨论】:
标签:
ruby-on-rails
ruby
search
hyperlink
product
【解决方案1】:
要创建一个链接,在您的视图中显示使用 some 类别的产品:
<%= link_to 'Some', products_path(cat: :some) %>
您需要将控制器更改为:
@products = @products.where('title like ?', "%#{params[:search]}%") if params[:search]
@products = @products.where('category like ?', "%#{params[:cat]}%") if params[:cat]
我假设的事情太多了。
【解决方案2】:
如果您想根据标题或类别过滤您的产品,您执行此操作的方式很大程度上取决于您在视图中的过滤设置方式。如果您使用的选择框包含您想要过滤的特定标题,它在您的视图中(在表单标签内)看起来像这样:
<select name='title_filter'>
<option value="title_1">Title 1</option>
<option value="title_2">Title 2</option>
</select>
现在,当用户提交选择了标题的表单时,键“title_filter”将与用户选择的值一起添加到您的参数哈希中。您可以使用您指定的相同控制器操作,但只需让它检查您的新密钥:
if params[:title_filter]
@products = @products.where('title= ?', params[:title_filter])
else
# fallback if no title is selected
end
或者,如果您使用链接进行过滤,您可以使用 link_to:
<%= link_to 'My Title', products_path(title: :my_title) %>
另外,您使用where 子句的方式很危险。见Active Record guide
【解决方案3】:
在我看来,我最终使用了这个。由于某种原因,其他答案对我不起作用: