搬送波に問題があり、Rails 4つの強力なパラメータ。搬送波アップロードボタンのある非常に単純なモデルがあります。誰かがアップロードフォームを送信すると、エラーメッセージが表示されます。アップロードするファイルを選択せずに。
現在、次のメッセージでparam not found:photo
エラーが発生します。
# Never trust parameters from the scary internet, only allow the white list through.
def photo_params
params.require(:photo).permit(:image)
end
このエラーは、Rails 4の強力なパラメーターにより、フォームを送信するために画像パラメーターが存在する必要があるために発生していますが、ユーザーが画像を選択していないため、画像パラメーターは存在しません。
これを回避して同じアクションにリダイレクトし、エラーメッセージを表示する方法がわかりません。
強力なパラメータでこれを行う方法はありますか?
写真を選択せずにフォームを使用しようとすると、開発ログが表示されます: https://Gist.github.com/leemcalilly/09b6166ce1af6ca6c8
写真を選択して正常にアップロードされたときの開発ログは次のとおりです。 https://Gist.github.com/leemcalilly/1f1e584f56aef15e7af1
その他の関連ファイル:* models/photo.rb -- https://Gist.github.com/leemcalilly/95c54a5df4e4ee6518da * controllers/photos_controller.rb -- https://Gist.github。 com/leemcalilly/c0723e6dc5478b0f914d * uploaders/image_uploader.rb -- https://Gist.github.com/leemcalilly/5e43f6524734991773ae * views/photos/index.html.erb -- https://Gist.github.com/leemcalilly/a8c4c808e5e8a802933b * views/photos/_form.html.erb -- https://Gist.github.com/leemcalilly/cd0fd518c1b47d9bfb62 * initializers/Carrierwaver.rb -- https://Gist.github.com/leemcalilly/49e04fa1dda891dd108b
レールガイドが解決策を提供します 。 fetch
メソッドをrequire
メソッドと同じ方法で使用します。 2番目の引数に注意してください:デフォルト値を提供します。したがって、params[:photo]
が見つからない場合、デフォルト値(以下の例のように空のハッシュ)が返されます:
params.fetch(:photo, {})
申し訳ありませんが、これは少し遅れています。次のようなフォームコードを確認してください。
_<%= form_for @photo, :html => {:multipart => true} do |f| %>
<% if @photo.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@photo.errors.count, "error") %> prohibited this photo from being saved:</h2>
<ul>
<% @photo.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<fieldset>
<legend>Upload a Photo</legend>
<div class="field">
<%= f.file_field :image %>
</div>
</fieldset>
<%= f.submit "Upload Photo", :class => "btn btn-small" %>
<% end %>
_
これはRails
またはcarrierwave
または_strong_parameter
_に問題はありません。これは、html
がどのように機能するかということです。このように、file
入力があり、nothing
がアタッチされている場合、name
とvalue
のペアはHTML
によってサーバーに送信されません。checkbox
またはdisabled
フィールドのようなものと考えてください。
フォームには_<%= f.file_field :image %>
_のみが含まれ、他のフィールド(写真モデルの属性)は含まれていないためです。
したがって、photo
入力_does not
_に添付ファイルが含まれている場合、file
ハッシュは作成されません。
これはあなたのログでも明らかです
_{"utf8"=>"✓", "authenticity_token"=>"IvOieBvxdA6qzVKrt1dYBuCXlt+uuWCyWjUAuTK0XEU=", "commit"=>"Upload Photo"}
_
_ {"utf8"=>"✓", "authenticity_token"=>"I4O0w+Wk8nJaD6HJRSC+FfuAip5NVE6TkCUFDEN+sW0=", "photo"=>{"image"=>#<ActionDispatch::Http::UploadedFile:0x007fc730b5de08 @tempfile=#<Tempfile:/var/folders/0m/n32lgww55vzf5pfc4kh17gm00000gr/T/RackMultipart20130801-32602-1nj6u2b>, @original_filename="bag.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"photo[image]\"; filename=\"bag.jpg\"\r\nContent-Type: image/jpeg\r\n">}, "commit"=>"Upload Photo"}
_
これで、2つの違いがわかり、その違いがエラーの理由であることがわかります。
最初のケース
_params[:photo].present?
_ => false
2番目のケース
_params[:photo].present?
_ => true
したがって、これを行うとparams.require(:photo).permit(:image)
コードはエラーをスローします
not
に存在するparams
である.require(:photo)
に言及している行があるため
おそらくあなたはこのようなことをすることができます
_ def photo_params
if params[:photo].present?
params.require(:photo).permit(:image)
end
end
_
HTML
添付ファイルno
_name=value
_ペアがサーバーに送信された場合にno
が機能し、そのためphoto
paramsがサーバーに送信されないため、ハッシュにそれらがないため、強力なパラメーターがエラーをスローするため、誰もが失敗することはありません
この助けを願っています