Rails路由-如何将范围参数添加到url_for帮助器?
我有资源简历,并且在视图中添加新简历的链接是:
I have resource bio and in views and link for add new bio is:
= link_to "Add new bio", [:new, :admin, :bio]
如果我将resource:bio放在这样的范围内:
If I put resource :bio to scope like this:
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助手添加范围参数?
My question is how can I add scoped param to url_for helper? And can rails do this by default?
p.s。 new_admin_bio_path({bio_type:params [:bio_type]})可以正常工作,但是很好奇
p.s. new_admin_bio_path({bio_type: params[:bio_type]}) works fine, but it's just curious
我相信您无法做到这一点数组参数为 link_to
。您必须使用 polymorphic_path
或 new_admin_bio_path({bio_type:params [:bio_type]})
I believe you cannot make this with array params to link_to
. You have to use polymorphic_path
or new_admin_bio_path({bio_type: params[:bio_type]})
原因是 link_to
用调用
,它使用这些参数调用 url_for
[ :new,:admin,:bio,{bio_type:params [:bio_type]}] polymorphic_path
。
The reason is that link_to
calls url_for
with [:new, :admin, :bio, { bio_type: params[:bio_type] }]
, which calls polymorphic_path
with these params.
检查 url_for 和 polymorphic_url 。
注意, polymorphic_url
需要2个参数- record_or_hash_or_array
和 options
,但 url_for
仅使用一个参数调用它。
Check the source code for url_for and for polymorphic_url.
Notice, that polymorphic_url
takes 2 params - record_or_hash_or_array
and options
, but url_for
calls it with one parameter only.
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
选项正确调用应该听起来像是
So, correct call with the scope
option should sound like
polymorphic_path([:new, :admin, :bio], bio_type: params[:bio_type])