Rails 4 和 Paperclip,不允许的参数:附件
Rails 4 and Paperclip, Unpermitted parameter: attachment
我找到了一些解决方案,但 none 有效。
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 有对象:附件。该对象在上传模型中,模型与问题模型有关系。问题模型具有带有上传属性的形式。
更新 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"}
那是因为如果您查看表单,文件输入使用 "attachment" 作为参数名称:f.input :attachment
.
在您的 issue_params
方法中,您不允许参数 attachment
,只允许嵌套参数 upload[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
您现在应该不会再看到警告。顺便说一下,这只是一个警告。
如果您从不路由到上传,则不需要上传控制器。相反,要访问上传模型,请从问题控制器执行此操作,如下所示:
- 从带有
image = issue_params[:attachment]
的问题参数中获取附件。
upload = Upload.new(image)
upload.save
如果您需要更多说明,请发表评论。
编辑:
检查完模型后,不要Upload.new
。相反,在您的#create 方法中,使用新创建的问题来创建连接的上传:issue.uploads.new(image)
。这完全取决于您的#create 方法的外观。我目前假设您在其中创建了一个新问题,然后保存了它。
我还建议取消上传模型。 Paperclip 是一个很棒的 gem,可以消除上传的所有麻烦。当 Paperclip 将附件无缝添加到您的问题模型时,为什么要创建上传模型?
编辑 2:
要制作嵌套表格,您可以这样写:
<%= f.fields_for :uploads do |upload| %>
<%= upload.input :attachment %>
<% end %>
并使用它代替您当前拥有的单一输入。那有意义吗?您实际上是在将表单嵌套在表单中。
你试过这个吗
<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>
我找到了一些解决方案,但 none 有效。
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 有对象:附件。该对象在上传模型中,模型与问题模型有关系。问题模型具有带有上传属性的形式。
更新 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"}
那是因为如果您查看表单,文件输入使用 "attachment" 作为参数名称:f.input :attachment
.
在您的 issue_params
方法中,您不允许参数 attachment
,只允许嵌套参数 upload[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
您现在应该不会再看到警告。顺便说一下,这只是一个警告。
如果您从不路由到上传,则不需要上传控制器。相反,要访问上传模型,请从问题控制器执行此操作,如下所示:
- 从带有
image = issue_params[:attachment]
的问题参数中获取附件。 upload = Upload.new(image)
upload.save
如果您需要更多说明,请发表评论。
编辑:
检查完模型后,不要Upload.new
。相反,在您的#create 方法中,使用新创建的问题来创建连接的上传:issue.uploads.new(image)
。这完全取决于您的#create 方法的外观。我目前假设您在其中创建了一个新问题,然后保存了它。
我还建议取消上传模型。 Paperclip 是一个很棒的 gem,可以消除上传的所有麻烦。当 Paperclip 将附件无缝添加到您的问题模型时,为什么要创建上传模型?
编辑 2:
要制作嵌套表格,您可以这样写:
<%= f.fields_for :uploads do |upload| %>
<%= upload.input :attachment %>
<% end %>
并使用它代替您当前拥有的单一输入。那有意义吗?您实际上是在将表单嵌套在表单中。
你试过这个吗
<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>