2

与えられたコード(routes.rb内):

  resources :products do
    member do
      get :delete #this works
      delete delete: "products#destroy" #this doesn't work
      delete "delete" => "products#destroy" #but this works
    end
  end

なぜ回線delete delete: "products#destroy"が機能​​せず、回線がdelete "delete" => "products#destroy"機能​​するのですか?

Railsバージョン3.2.11

4

3 に答える 3

3

削除アクションをマップして破棄する場合は、次を使用する必要がありますmatch

match 'products/:id/delete', controller: :products, action: :destroy, via: :delete

しかし、これを行う理由はわかりません。私の意見では、レールのデフォルトの破棄アクションに固執する必要があります。

また、リソースにはすでにコントローラーが指定されており、適切なhttpプロトコルでアクションを追加するために使用されているため、機能しません。

于 2013-01-19T14:02:30.500 に答える
1

これが機能しない理由と、エラーのバックトレースに従う場合はmapper.rb、Railsの次の行が原因です。

def match(path, *rest)
  if rest.empty? && Hash === path
    options  = path
    path, to = options.find { |name, value| name.is_a?(String) }
    options[:to] = to
    options.delete(path)
    paths = [path]
  else
    options = rest.pop || {}
     paths = [path] + rest
  end

  options[:anchor] = true unless options.key?(:anchor)

  if options[:on] && !VALID_ON_OPTIONS.include?(options[:on])
    raise ArgumentError, "Unknown scope #{on.inspect} given to :on"
  end
  paths.each { |_path| decomposed_match(_path, options.dup) }
  self
end

これは、舞台裏のすべてのメソッド(、、、、など)によって呼び出さdeletepostます。私たちが特に探している行は、次のようなものです。getput

path, to = options.find { |name, value| name.is_a?(String) }

なぜ文字列をチェックしているのかわかりませんが、名前は記号であり、ではStringなくSymbol。これにより、そのパスがnil値として送信さdecomposed_matchれ、ルートでシンボルを使用できない理由がどこかに発生します。

ノート

resources :products do
  member do
    get :delete #this works
    delete delete: "products#destroy" #this doesn't work
    delete "delete" => "products#destroy" #but this works
  end
end

動作する理由は、メソッドが呼び出されるget :delete前の行が原因です。match

特にこの方法で

def map_method(method, *args, &block)
  options = args.extract_options!
  options[:via] = method
  args.push(options)
  match(*args, &block)
  self
end

この行args.extract_options!は、配列からハッシュを削除します。extract_options.rbこれは、クラスに追加されたメソッドであるファイルの下にありますArray

とにかく、get :deleteはハッシュではなく単一のパラメータなので、このようなものにマップされます

Path: [delete]
Options [{via: "get"}]

さて、他のものはこのようにマッピングされます例えばdelete delete: "product#destroy"

Path {:delete=>"collaborators#destroy", via: "delete"}
Options []

次に、シンボルがルートで機能しない理由についての私の元のステートメントに戻ります。

于 2013-01-31T15:51:49.597 に答える
0

新しいハッシュ構文は、Rubyバージョン1.9からのみサポートされています。どのバージョンのRubyを使用していますか?

于 2013-01-30T14:10:38.787 に答える