web-dev-qa-db-ja.com

Rails 4つの強力なパラメーターparamnot found error withcarrierwave

搬送波に問題があり、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

19
Lee McAlilly

レールガイドが解決策を提供しますfetchメソッドをrequireメソッドと同じ方法で使用します。 2番目の引数に注意してください:デフォルト値を提供します。したがって、params[:photo]が見つからない場合、デフォルト値(以下の例のように空のハッシュ)が返されます:

params.fetch(:photo, {})
53
Mrjaco12

申し訳ありませんが、これは少し遅れています。次のようなフォームコードを確認してください。

_<%= 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がアタッチされている場合、namevalueのペアは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がサーバーに送信されないため、ハッシュにそれらがないため、強力なパラメーターがエラーをスローするため、誰もが失敗することはありません

この助けを願っています

12
Viren