0

次のパラメーターを POST する画像をアップロードしています。

Parameters: {"url"=>"https://bucket.s3.amazonaws.com/image014.jpg",
"filepath"=>"/uploads%2F1381509934146-1t5a44loikwhr529-1d68490743e05a1287fea45ed4ed9e59%2Fslide0005_image014.jpg",
"filename"=>"slide0005_image014.jpg", 
"filesize"=>"30807", 
 "filetype"=>"image/jpeg", 
 "unique_id"=>"1t5a44loikwhr529", 
 "choice"=>["https://bucket.s3.amazonaws.com/image014.jpg"]}

そして、ここに私のフォームがあります:

<%= s3_uploader_form callback_url: choices_url, callback_param: "choice[]", id: "s3-uploader" do %>
  <%= file_field_tag :file, multiple: true %>
   <button type="submit" class="btn btn-primary start"> 
<% end %>

そして、私のコントローラーには次のものがあります。

#app/controllers/choices_controller

def create
@choice = Choice.create!(choice_params)
  if @choice.persisted?
    respond_to do |format|
      format.html { redirect_to choices_path }
      format.json { head :no_content }
    end
  end
end

def choice_params
  params.require(:choice).permit(:url, :filepath, :filename, :filesize, :filetype)
end

しかし、それはエラーを返します:

 NoMethodError (undefined method `permit' for #<Array:0x007f903e380060>):
  app/controllers/choices_controller.rb:49:in `choice_params'
  app/controllers/choices_controller.rb:24:in `create'

ここで私が間違っていることを教えてもらえますか? 私がやりたいことは次のとおりです。

1) 「url」パラメータを DB に追加します。2) 「filename」パラメータをタイトル化し、それを DB に送信します。

どうもありがとう!

4

1 に答える 1

1

なぜ ?

requireのようparams[:some_key]に動作ActionController::ParameterMissingしますが、返される値が空白の場合に発生します。

この場合、 を使用してエラーrescue_fromをレンダリングできるため、これは便利です。400: bad request

何をすべきか ?

そのため、呼び出すときrequire(:choice)にハッシュを取得できるように、パラメーターをラップする必要があります。

残念ながらs3_upload_form、 と同じビルダー構文をサポートしていないようですform_for。これにより、次のことが可能になります。

<%= form_for :s3_upload do |f| %>
    <% f.file_field :file %>
<% end %>

次のような params ハッシュが生成されます。

 { s3_upload: {file: <SomeFile ...>} }

したがって、私のアドバイスは、require呼び出しをやめ:choiceて、 に渡された他の引数を一緒に置くことpermitです。

メソッドの利点 (つまり、パラメーターが欠落しているかどうかを確認する) を引き続き利用したい場合requireは、次の行に沿っていつでも何かを行うことができます。

def choice_params
  params.permit(:foo, :bar, :baz).tap do |p| 
    p.each_key{ |k| p.require k }
  end
end

許可されたパラメーターのいずれかが欠落している場合、これにより例外が発生します。

于 2013-10-11T17:18:41.930 に答える