Rails路由-如何将范围参数添加到url_for帮助器? [英] Rails routing - how to add scope param to url_for helper?

查看:104
本文介绍了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])

这篇关于Rails路由-如何将范围参数添加到url_for帮助器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆