通过另一个视图上传图像

时间:2014-11-05 22:53:45

标签: ruby-on-rails

我正在使用Paperclip Gem。

class Business < ActiveRecord::Base
  has_many :images, :as => :imageable
  has_many :reviews
end

class Image < ActiveRecord::Base
  belongs_to :imageable, :polymorphic => true
  has_attached_file :photo
end

class Review < ActiveRecord::Base
  belongs_to :business
  has_many :images, :as => :imageable
end

这有效images/_form.html.erb

<%= form_for @image do |f| %>
  <%= f.fields_for :photos_attributes do |photo| %>
    <%= photo.file_field :image, :multiple => false %>
  <% end %>
  <%= f.submit 'Save' %>
<% end %>

图像控制器:

def create
  @image = @business.images.new(image_params)
  if @image.save
    flash[:success] = "Image uploaded!"
    redirect_to root_url
  else
    render 'new'
  end
end

我希望能够通过评论上传图片。我在想这样的事情:

<%= form_for @review do |f| %>
  <%= f.text_area :content %>
  <%= f.fields_for :photos_attributes do |photo| %>
    <%= photo.file_field :image, :multiple => false %>
  <% end %>
  <%= f.submit 'Submit Review with Image'%>
<% end %>

我的评论控制器如何查看,因为图像来自图像模型,其余部分来自评论模型?

3 个答案:

答案 0 :(得分:2)

我将其列出的方式就是这样 -

<强>模型

class Business < ActiveRecord::Base

  has_many :images, :as => :imageable
  has_many :reviews

end

class Image < ActiveRecord::Base

  belongs_to :imageable, :polymorphic => true

end

class Review < ActiveRecord::Base

  belongs_to :business
  has_many :images, :as => :imageable

  accepts_nested_attributes_for :images

end

我已添加accepts_nested_attributes_for :images,因为您需要让审核控制器保存图像,同时保存图像。我不确定你是如何设置业务控制器的,但我建议以同样的方式做,更清晰,更有意义。

查看视图 - 表单视图

<%= form_for @review do |f| %>
     <%= f.text_area :content %>
     <%= f.fields_for :images do |photo| %>
         <%= photo.file_field :photo, :multiple => false %>
     <% end %>
     <%= f.submit 'Submit Review with Image'%>
 <% end %>

我稍微更改了表单,以使accepts_nested_attributes_for :images更好地工作。

最后审核控制器

审核控制器

class ReviewsController < ApplicationController


  def new

  @review = Review.new
  @review.images.build

  end

  def create

  @business = Business.find(id_of_business_your_reviewing)
  @review = @business.reviews.build(review_params)

  if @review.save

      puts "Saved"
      redirect_to "path"
  else

      puts "Something failed"
      render 'new'

  end

  end

private

    def review_params

    params.require(:review).permit(:content, :images_attributes => [:id, :photo])

    end

end

这将允许您创建新评论并通过图像向其添加照片。无需转到图像控制器,因为Review可以访问它并可以接受其属性。

我建议您在创建/编辑企业时实施类似于商业模式的内容。我会使用业务控制器执行这些操作,并使用accepts_nested_attributes_for :images来允许它接受其属性。

希望这有助于回答您的问题。如果我没有正确解释,请告诉我。

答案 1 :(得分:1)

根据您的设计,您将无法知道哪些图片属于哪个评论,而是所有图片都属于该评论的母公司。

一个好的设计是对Image模型使用多态关联。

class Business < ActiveRecord::Base
 has_many :images, as: :parent
 has_many :reviews
end

class Image < ActiveRecord::Base
 belongs_to :parent, polymorphic: true
 has_attached_file :photo
end

class Review < ActiveRecord::Base
 has_many :images, as: :parent
 belongs_to :business
end

并使用我在案例1中建议的两种可能解决方案之一。请注意,2号更好

如果您不知道如何构建多态关联,请检查this link


案例1对于具有类似商业模式::

的关系的模型

你可以:

1 - 向 business_controller 添加新操作,使用您在图像问题中编写的表单添加图像,例如代码,但是包含指向操作的路径。 表单应该有像

这样的标题
form_for @image, :url => whatever_path_to_the_action

2 - 在模型中使用 accept_nested_attributes ,并使用 business_controller 中已有的新操作和编辑操作,而不再使用任何代码,图像将随业务一起保存是新内容还是仅编辑它以添加新图片,在视图中使用 fields_for

如果您不熟悉 accept_nested_attributes以及此this来构建表单,请参阅此链接。

    如果您遵循建议的设计,
  • 也会进行审核。

对于与您的设计中的评论模型无关的模型::

您可以向 reviews_controller add_image添加操作。

def add_image
  @image = @review.business.images.new(image_params)
  if @image.save
    flash[:success] = "Image uploaded!"
    redirect_to root_url
  else
    render 'YOUR FORM'
  end
end

<%= form_for @image, url: path_to_the_action_add_image do |f| %>
  <%= f.file_field :photo %>
  <%= f.text_area :content %>
  <%= f.submit 'Submit Review'%>
<% end %>

如果您有兴趣知道哪个图片属于哪个评论与该评论一起显示,那么这不是一个好的设计

答案 2 :(得分:1)

如果您想通过评论添加图片。你应该在它们之间有一些关系。我添加了has_one关系。哪种理想适合您的情况。您也可以添加has_many。您的模型应如下所示:

class Business < ActiveRecord::Base
 has_many :images
 has_many :reviews
end

class Image < ActiveRecord::Base
 belongs_to :business
 belongs_to :review
 has_attached_file :photo
end

class Review < ActiveRecord::Base
 has_one :image
 belongs_to :business
end

您的表单应如下所示:

<%= form_for @review do |f| %>
  <%= f.text_area :content %>
  <%= fields_for :image do |i| %>
    <%= i.file_field :photo %>
  <% end %>
  <%= f.submit 'Submit Review'%>
<% end %>

如果您使用的是导轨4.控制器中需要进行更改:

def create
  @review = Review.create(review_params) #This will create photo as well
  redirect_to xyz_path
end

private

  def review_params
    params.require(:review).permit(:content, images_attributes: [:id, :photo, :_destroy])
  end

您还需要添加数据库更改。所以要做出相应的改变(在照片模型中添加review_id

我使用了更简单的方法。您也可以为图像和其他模型使用多态关联。