我正在使用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 %>
我的评论控制器如何查看,因为图像来自图像模型,其余部分来自评论模型?
答案 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
)
我使用了更简单的方法。您也可以为图像和其他模型使用多态关联。