4

私はリソースバイオを持っており、新しいバイオを追加するためのビューとリンクは次のとおりです。

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

リソース: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ヘルパーに追加するにはどうすればよいですか?そして、レールはデフォルトでこれを行うことができますか?

ps new_admin_bio_path({bio_type:params [:bio_type]})は正常に機能しますが、興味があります

4

1 に答える 1

6

配列パラメータを使用してこれを作成することはできないと思いますlink_topolymorphic_pathまたはを使用する必要がありますnew_admin_bio_path({bio_type: params[:bio_type]})

その理由は、これらのパラメータでlink_to呼び出すurl_for[:new, :admin, :bio, { bio_type: params[:bio_type] }]で呼び出すためです。polymorphic_path

url_forおよびpolymorphic_urlのソースコードを確認してください。これは2つのパラメータ-とをpolymorphic_url取りますが、1つのパラメータのみで呼び出すことに注意してください。record_or_hash_or_arrayoptionsurl_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])
于 2012-07-17T09:50:40.997 に答える