0

我的第一个项目中有一段 routes.rb 代码:

  match '/signup',  to: 'users#new'
  match '/signin',  to: 'sessions#new'

我可以使用这个 routes.rb 来使用“signup_path”和“signin_path”。我的第二个项目中有以下 routes.rb 代码:

  resources :places, only: [:index]
  match '/places/by_type/:id', to: 'places#filter'

我希望能够使用“places_by_type_path”,但我错了。请告诉我,为什么在第一种情况下会自动构建路径?为什么我必须在第二种情况下使用“as”结构?谢谢

4

3 回答 3

0

你的路线是错误的,坚持 REST 原则来保持一个干净的应用程序:

resources :places, only: [:index] do
  member do
    get :by_type, action: :filter #, as: 'a_name' if needed
  end
end

这样你就会有/places/:id/by_type

用于rake routes检查命名路由,as如果需要使用选项

于 2013-10-01T18:09:04.667 回答
0

我不知道为什么,但它似乎是 :id 参数。尝试这个:

match '/places/by_type/', to: 'places#filter'

并传递一个参数:

places_by_type_path(id: my_id)
于 2013-10-01T18:11:02.483 回答
0

在 Railscasts 上找到了这个。只要您的路径没有任何非单词字符(例如“:”),它就会自动填写您的 :as 参数。

def normalize_options!
    path_without_format = @path.sub(/\(\.:format\)$/, '')

    if using_match_shorthand?(path_without_format, @options)
      to_shorthand    = @options[:to].blank?
      @options[:to] ||= path_without_format[1..-1].sub(%r{/([^/]*)$}, '#\1')
      @options[:as] ||= Mapper.normalize_name(path_without_format)
    end

    @options.merge!(default_controller_and_action(to_shorthand))
  end
# match "account/overview"
def using_match_shorthand?(path, options)
  path && options.except(:via, :anchor, :to, :as).empty? && path =~ %r{^/[\w\/]+$}
end

这是您需要对 :as 参数执行的操作:

match '/places/by_type/:id', to: 'places#filter', as: 'places_by_type'

http://guides.rubyonrails.org/routing.html#naming-routes

于 2013-10-01T18:01:10.170 回答