具有可选参数的路由

时间:2013-05-03 06:47:46

标签: ruby-on-rails routing

以下尝试似乎有效,但不是我试图存档的“干净”结果。

以下路线

get "/learn(/:category)", to: "users#index", as: "learn"

应该可用于“/ learn / technology”之类的东西 - 如果在地址栏中手动输入,则可以使用。

如果我努力尝试在我的观点中实现类似,我会得到以下内容:“/ learn?category = technology” - 哪个好,技术上有效,但不是我想要的。

我在我的观点中使用以下内容:

- Category.promoted.limit(7).each do |category|
  %li.category-button
    = link_to learn_path(category) do
      = button_tag "", :class => "#{category.name}"
      = content_tag(:span, category.to_s, :class => 'category-head')

我的分类模型看起来如下:

class Category < ActiveRecord::Base
  has_many :skills

  validates_uniqueness_of :name

  scope :promoted, lambda { where(:promoted => true) }

  def to_s
    read_attribute(:name).titleize
  end

  def to_param
    name.parameterize
  end
end

我如何实现'清洁'解决方案?

编辑:

以下工作 - 但必须有比这更好的解决方案吗?

get "/learn", to: "users#index", as: "learn"  
get "/learn/:category", to: "users#index", as: "filter_learn"

2 个答案:

答案 0 :(得分:0)

尝试将您的链接更改为以下内容:

...
= link_to learn_path(category: category.name) do
...

答案 1 :(得分:0)

您可以使用url_for来解决问题。

假设我UsersController采取index行动,并在routes.rb中执行此操作:

resources :users, only: [:index] do
  collection do
    get ':kind', :to => 'users#index'
  end
end

然后,当我在/ users页面上时,我可以这样使用url_for

= link_to 'Kind1', url_for(kind: :students)

将产生路径:

/users/students

如果我在另一个页面(另一个控制器或其他操作),那么我应该提供更多信息。例如,当我在另一个控制器的页面上时,如果目标操作不是controller,那么我应该提供actionindex参数(如果目标操作是index那么它是足以仅提供controller):

= link_to 'Kind1', url_for(controller: :users, action: :index, kind: :students)

它产生相同的路径:

/users/students

使用users_path(kind: :students)时,您将获得:

/users?kind=students