形成多态图像

时间:2018-02-06 18:11:20

标签: ruby-on-rails ruby

我在添加评论图片时遇到问题。评论与图片has_manyas: :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吗?

2 个答案:

答案 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用于嵌套表单。