【问题标题】:Rails 4 and Paperclip, Unpermitted parameter: attachmentRails 4 和 Paperclip,未经许可的参数:附件
【发布时间】:2016-03-03 12:55:40
【问题描述】:

我找到了一些解决方案,但都没有奏效。

upload.rb:

class Upload < ActiveRecord::Base
  belongs_to :issue
  # This method associates the attribute ":attachment" with a file attachment
  has_attached_file :attachment, styles: {
    thumb: '100x100>',
    square: '200x200#',
    medium: '300x300>'
  }

  # Validate the attached image is image/jpg, image/png, etc
  validates_attachment_content_type :attachment,
    :content_type => /\Aimage\/(jpg|jpeg|pjpeg|png|x-png|gif)\z/,
    :message => "file type is not allowed (only images)"
end

issue.rb

class Issue < ActiveRecord::Base
  has_many :uploads
  accepts_nested_attributes_for :uploads, allow_destroy: true
end

问题的部分形式:

<%= simple_form_for [@project, @issue], wrapper: :horizontal_form, html: { multipart: true, class: "form-horizontal", remote: true, id: "my-form" } do |f| %>
    <% f.input :title %>
        <div class="dropzone" id="dropzone-upload">
            <div class="fallback">
                <%= f.input :attachment, as: :file, multiple: true, name: "upload[attachment]" %>
            </div>
        </div>  
    <%= f.button :submit, id:"submit", class: "btn btn-default btn-primary" %>
<% end %>

issue_controller.rb:

def issue_params
    params.require(:issue).permit(
      :title,
      uploads_attributes: [:id, :attachment, :issue_id]
    )
end

更新

好的,我的控制台日志:

 Started POST "/projects/1/issues" for 127.0.0.1 at 2016-03-03 13:36:19 +0100
    Processing by IssuesController#create as HTML
      Parameters: {"utf8"=>"✓", "issue"=>{"title"=>"kljjl;kklj",  "attachment"=>"upload[attachment]"}
      Project Load (0.7ms)  SELECT  `projects`.* FROM `projects` WHERE `projects`.`id` = 1 LIMIT 1
    Unpermitted parameter: attachment
       (9.5ms)  COMMIT
    Redirected to http://localhost:3000/projects/1
    Completed 302 Found in 46ms (ActiveRecord: 4.5ms)

upload_controller.rb

def upload_params
    params.require(:upload).permit(:attachment)
end

这里的想法是:Paperlip 有对象:附件。此对象在 Upload 模型中,并且模型与问题模型有关系。问题模型具有带有 Upload 属性的表单。

更新 16:45 03.03.16

我已更新表单以使用正确嵌套的属性,但仍然有相同的错误

<div class="dropzone" id="dropzone-upload">
    <div class="fallback">
      <%= f.simple_fields_for :uploads do |u| %>
        <%= u.input :attachment, as: :file, multiple: true %>
      <% end %>
    </div>
  </div>  

更新 16:37

控制台日志:

Started POST "/projects/1/issues" for 127.0.0.1 at 2016-03-03 16:26:03 +0100
Processing by IssuesController#create as HTML
  Parameters: {"utf8"=>"✓", "issue"=>{"title"=>"wfwrv"}

【问题讨论】:

  • 你能分享列出所有参数的控制台日志吗?
  • 您的控制器和模型设置看起来正确。能否请您显示整个表单而不是仅显示部分表单。
  • 我认为您使用的嵌套形式有误。看看Simple_form nested models example
  • vucko 你是对的......我已经修复了表单的那部分,但我仍然有同样的错误。

标签: javascript ruby-on-rails ruby-on-rails-4 paperclip dropzone.js


【解决方案1】:

这是因为如果您查看表单,文件输入使用“附件”作为参数名称:f.input :attachment

在您的issue_params 方法中,您不允许参数attachment,只允许嵌套参数上传[附件]。

在调试此类问题时,您需要查看您的参数是什么。正如您在日志中看到的,它们看起来像这样:

Parameters: {"utf8"=>"✓", "issue"=>{"title"=>"kljjl;kklj",  "attachment"=>"upload[attachment]"}

所以您要提交问题[附件]。如果这就是您希望它在您的参数中的方式,那么只需从您的参数方法中删除“uploads_attributes:”。

应该看起来像:

def issue_params
    params.require(:issue).permit(
      :title,
      :id, 
      :attachment, 
      :issue_id
    )
end

您现在应该不会再看到警告了。顺便说一句,这只是一个警告。

如果您从不路由到上传,则不需要上传控制器。相反,要访问 Upload 模型,请从 Issues 控制器执行此操作,如下所示:

  1. 从问题参数中获取附件image = issue_params[:attachment]
  2. upload = Upload.new(image)
  3. upload.save

如果您需要更多说明,请发表评论。

编辑:

看完你的模型后,不要做Upload.new。相反,在您的 #create 方法中,使用新创建的问题来创建连接上传:issue.uploads.new(image)。这一切都取决于您的#create 方法是什么样的。我目前假设您在其中创建了一个新问题,然后将其保存。

我还建议摆脱上传模式。回形针是一个很棒的宝石,可以消除上传的所有麻烦。当 Paperclip 将附件无缝添加到您的问题模型时,为什么要创建上传模型?

编辑 2:

要制作嵌套表格,您可以这样写:

<%= f.fields_for :uploads do |upload| %>
  <%= upload.input :attachment %>
<% end %>

并使用它来代替您当前拥有的单个输入。那有意义吗?您实际上是在表单中嵌套表单。

【讨论】:

  • so...上传模型是为了处理上传这就是我将这两个模型分开的原因。在问题表单中,我使用上传属性(:附件)和 dropzone 获取此元素并在 POST 操作中使用 url(如果 drozpone 实用地创建则需要),所以我只是将 dropzone 重定向到上传控制器以在那里创建附件。这就是为什么我需要嵌套表单属性
  • 但是您没有在表单中添加“dropzone”。只是为了文件输入?而且您的表单永远不会碰到上传控制器,至少目前没有,而且我看不出它可能会如何基于我正在查看的内容。如果有更多相关代码,请分享。我的答案基于您最初发布的代码。
  • @Skrypter 所以我想我明白你现在想要做什么。如果你想嵌套一个上传表单inside问题表单,你需要实际嵌套它,而不仅仅是放f.input。所以,看看我的编辑。
  • 我的 dropzone 是务实地创建的,这意味着在元素上......当我首先点击“创建的问题”时,我已经从上传控制器上传以使用回形针将图像发送到 s3,上传后表单正在创建.. .
  • @Skrypter 那行得通吗?当您提交此表单时,您的上传控制器被击中了吗?我问只是因为您的控制台日志只显示您的问题控制器被击中。参数警告是因为我在回答中解释的内容。如果上传正常,我看不出问题出在哪里。
【解决方案2】:

你试过了吗

<div class="dropzone" id="dropzone-upload">
<div class="fallback">
  <%= f.fields_for Upload.new do |u| %>
    <%= u.input :attachment, as: :file, multiple: true %>
  <% end %>
</div>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多