Rails路由 - 如何将范围参数添加到url_for帮助程序?

时间:2012-07-17 09:36:02

标签: ruby-on-rails ruby routing rails-routing

我有资源生物和视图和链接添加新生物是:

= link_to "Add new bio", [:new, :admin, :bio]

如果我将资源:生物放入这样的范围:

namespace :admin do    
  scope "/:bio_type", :defaults => {:bio_type => "company"} do
    resources :bios
  end
end

这不起作用

= link_to "Add new bio", [:new, :admin, :bio, { bio_type: params[:bio_type] }]

我的问题是如何在url_for助手中添加作用域参数?并且rails可以默认执行此操作吗?

P.S。 new_admin_bio_path({bio_type:params [:bio_type]})工作正常,但只是好奇

1 个答案:

答案 0 :(得分:4)

我相信你不能用link_to的数组参数来做这个。您必须使用polymorphic_pathnew_admin_bio_path({bio_type: params[:bio_type]})

原因是link_to使用url_for调用[:new, :admin, :bio, { bio_type: params[:bio_type] }]polymorphic_path使用这些参数调用polymorphic_url

检查url_forpolymorphic_url的源代码。 请注意,record_or_hash_or_array需要2个参数 - optionsurl_for,但 def url_for(options = {}) options ||= {} case options when String options when Hash options = options.symbolize_keys.reverse_merge!(:only_path => options[:host].nil?) super when :back controller.request.env["HTTP_REFERER"] || 'javascript:history.back()' else polymorphic_path(options) end end def polymorphic_path(record_or_hash_or_array, options = {}) polymorphic_url(record_or_hash_or_array, options.merge(:routing_type => :path)) end def polymorphic_url(record_or_hash_or_array, options = {}) if record_or_hash_or_array.kind_of?(Array) record_or_hash_or_array = record_or_hash_or_array.compact if record_or_hash_or_array.first.is_a?(ActionDispatch::Routing::RoutesProxy) proxy = record_or_hash_or_array.shift end record_or_hash_or_array = record_or_hash_or_array[0] if record_or_hash_or_array.size == 1 end record = extract_record(record_or_hash_or_array) record = convert_to_model(record) args = Array === record_or_hash_or_array ? record_or_hash_or_array.dup : [ record_or_hash_or_array ] inflection = if options[:action] && options[:action].to_s == "new" args.pop :singular elsif (record.respond_to?(:persisted?) && !record.persisted?) args.pop :plural elsif record.is_a?(Class) args.pop :plural else :singular end args.delete_if {|arg| arg.is_a?(Symbol) || arg.is_a?(String)} named_route = build_named_route_call(record_or_hash_or_array, inflection, options) url_options = options.except(:action, :routing_type) unless url_options.empty? args.last.kind_of?(Hash) ? args.last.merge!(url_options) : args << url_options end args.collect! { |a| convert_to_model(a) } (proxy || self).send(named_route, *args) end 仅使用一个参数调用它。

scope

因此,使用polymorphic_path([:new, :admin, :bio], bio_type: params[:bio_type]) 选项进行正确调用听起来应该是

{{1}}