我在添加评论图片时遇到问题。评论与图片has_many
有as: :imageable
的链接。如何将图片上传到评论表单?
# app/models/comment.rb
class Comment < ApplicationRecord
belongs_to :article
belongs_to :user
has_many :images, as: :imageable
accepts_nested_attributes_for :images, allow_destroy: true
end
# app/models/Image.rb
class Image < ApplicationRecord
has_attached_file :img
validates_attachment :img, content_type: { content_type:
["image/jpg",
"image/jpeg", "image/png", "image/gif"] }
belongs_to :imageable, polymorphic: true, required: false
end
# app/controllers/comments_controller.rb
class CommentsController < ApplicationController
def create
@article = Article.find(params[:article_id])
@comment = @article.comments.create(comment_params)
@comment.user_id = current_user.id
@comment.save
redirect_to article_path(@article)
end
def destroy
@article = Article.find(params[:article_id])
@comment = @article.comments.find(params[:id])
@comment.destroy
redirect_to article_path(@article)
end
private
def comment_params
params.require(:comment).permit(:commenter, :body)
end
end
# app/views/comments/_form.html.erb
<%= form_with(model: [ @article, @article.comments.build ],
local:true) do |form| %>
<p>
<%= form.label :commenter %><br>
<%= form.text_field :commenter %>
</p>
<p>
<%= form.label :body %><br>
<%= form.text_area :body %>
</p>
<p>
<%= form.submit %>
</p>
<% end %>
# app/views/articles/show.html.erb
<%= render 'comments/form'%>
我设法通过ActiveAdmin在评论中添加图片,但我不知道如何使用表单。
那么,我应该为图像添加什么?我应该在images_controller中编写方法create
吗?
答案 0 :(得分:0)
如果我正确理解您的问题,您就会问如何在Comment
表单中嵌套子表单。这通常使用#fields_for帮助程序实现。
对于一对多关系,您可以执行以下操作:
<%= form_for(...) ... do |comment_form| %>
# beginning of form for Comment ...
<p class="imageables">
<ul>
<%= form.fields_for :imageables do |comment_image_form| %>
<li>
# Add Image fields here
</li>
<% end %>
</ul>
</p>
# rest of form / submit button
<% end %>
将上述内容改编为您应用程序的当前表单。这只能通过您在Comment
中进行的accepts_nested_attributes_for来电来实现。
您还需要通过strong parameters模式查看Image
关联的参数列入白名单。也就是说,#comment_params
的{{1}}方法需要添加CommentsController
属性,否则会被忽略并显示警告。
我还建议您从局部视图加载Image
字段,如下所示:
fields_for
查看nested forms的指南以获取更多详细信息。
答案 1 :(得分:0)
用户PaperClip宝石。
在您的视图中添加:
<%= file_field_tag "imageables[]", type: :file, multiple: true %>
在控制器内的create方法中:
if params[:imageables]
params[:imageables].each { |image|
@comment.imagables.create(image: image)
}
end
另一种更好的方式: 使用PaperClip&amp; Cocoon gem用于嵌套表单。