19

我在使用carrierwave 和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/09b6166ce1af6ca6c833

这是我选择照片并成功上传时的开发日志: 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 * 意见/照片/index.html.erb - https://gist.github.com/leemcalilly/a8c4c808e5e8a802933b * 意见/照片/_form.html.erb - https ://gist.github.com/leemcalilly/cd0fd518c1b47d9bfb62 * 初始化程序/carrierwaver.rb - https://gist.github.com/leemcalilly/49e04fa1dda891dd108b

4

2 回答 2

55

导轨提供了解决方案。使用fetch方法与方法相同require注意第二个参数:它提供默认值。因此,如果params[:photo]找不到,将返回默认值(一个空哈希,如下例所示)

params.fetch(:photo, {})
于 2013-08-05T17:26:51.587 回答
12

抱歉发现这有点晚了,好的,现在看看你的表单代码,看起来像这样

<%= 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 %>

现在这不是问题railsor carrierwaveorstrong_parameter它是如何html工作的。就像这样,如果您有file输入并且如果nothing附加到它,则不会将nameand对发送到服务器,因为它类似于or字段valueHTMLcheckboxdisabled

现在,由于您的表单仅包含 <%= f.file_field :image %> 并且不包含任何其他字段(照片模型的属性)

因此,当输入包含任何附件photo时,不会构造哈希filedoes not

这在您的日志中也很明显

参数(不带附件)=>

{"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"}

现在您可以看到两者之间的差异,并且差异是您错误的原因,因为在

第一种情况

params[:photo].present?=> 假的

第二种情况

params[:photo].present?=> 真

因此,当您这样做时params.require(:photo).permit(:image),代码会引发错误

因为这行提到了.require(:photo)存在notparams

解决方案:-

也许你可以做这样的事情

   def photo_params
     if params[:photo].present?
      params.require(:photo).permit(:image)
     end
   end

结论 :-

这不是任何人的错,因为HTML如果no附件no name=value对提交到服务器并且由于photo没有将哪些参数发送到服务器因此哈希没有它们并且因此强参数引发错误,这就是工作方式

希望这有帮助

于 2013-08-04T07:05:33.023 回答