使用URL中的干净参数在rails 4中路由

时间:2016-07-22 18:34:09

标签: ruby-on-rails ruby routing

路由如何在rails 4中运行?我想要实现的是这样的网址:

..../categories/<name of category>

目前我得到:

..../categories?utf8=✓&category=dingus

html是:

<%= form_tag(categories_path, :method => "get") do %>
   <%= select_tag 'category', options_for_select(@categories, params[:category]), {onchange: "this.form.submit();", prompt: "Select Category"} %>
<% end %>

和这样的路线:

 get '/' => '<controller>#h'
 get 'categories' => '<controller>#categories'

我知道我可以使用gem friendly_id来设置从类别/:id到category /:category的url样式。但我仍然坚持了解路线的最初步骤。我尝试了很多东西,但它非常令人困惑。任何想法或建议将不胜感激!

谢谢!

2 个答案:

答案 0 :(得分:0)

请参阅Routing Guide,特别是有关资源的部分。

如果您有routes.rb

resources :categories

您可以使用表单助手,例如:

<%= form_tag(categories_path, :method => "get") do %>
   <%= select_tag 'category', options_for_select(@categories.map {|c| [c.name, category_path(c)]}, params[:category]), {onchange: "window.location.href = this.value;", prompt: "Select Category"} %>
<% end %>

如果您在Category模型中添加了to_param定义:

class Category < ActiveRecord::Base
  def to_param
    name
  end
end

然后,您的所有网址都会按照您的意愿.../categories/booksurl_for帮助程序会为您生成适当的URL:

assert category_path(@book_category) == "/categories/book"

有关详情,请参阅ActiveRecords::Integrations#to_param文档。

答案 1 :(得分:0)

我无法得到Sam的确切解决方案。我的@categories是Post模型中唯一类别的派生数组:

@categories = Post.pluck(:category).uniq

所以稍作改动就像:

ERB:

<%= form_tag do %>
    <%= select_tag 'category', options_for_select(@categories.map {|c| [c, show_category_path(c)]}, params[:category]), {onchange: "window.location.href = this.value;", prompt: "Select Category"} %>
<% end %>

routes.rb中:

get '/categories/:category' => 'posts#categories', as: 'show_category'

控制器

def categories
    @posts = Post.where(category: params[:category])
end

因此网址为:/categories/dingus。我有问题,空格现在显示为%20(例如/categories/dingus%20burger,但这是另一回事,我怀疑to_param或url_for方法将有助于那个

本教程非常有助于我更好地了解路线:https://www.youtube.com/watch?v=16Bk_0RADLQ