如何从上传器中取出时限制附件/图像的数量

时间:2014-01-07 20:13:37

标签: ruby-on-rails ruby ruby-on-rails-4 rails-activerecord uploader

在我的Ruby on Rails项目中,我使用上载器来处理带载波和minimagick的图像。通过我的网站,我确实使用了几次。但我想限制页面上的图像数量。因此,cms的用户不能上传例如主页上的2个以上的图像和联系页面上的3个图像。

On another answer I found限制,由模型引起。但我想确定每页的图像数量。所以在我看来,这只能在视图中完成每个页面单独处理它们。

显示图片的代码是:

<% for attachment in @page.attachments %>
<div class="painting">
  <%= image_tag attachment.image_url if attachment.image? %>
  <div class="name"><%= attachment.name %></div>
  <div class="actions">
    <%= link_to "edit", edit_attachment_path(attachment) %> |
    <%= link_to "remove", attachment, :confirm => 'Are you sure?', :method => :delete %>
  </div>
</div>
  

我也找到了这个

<%= image_tag attachment.image_url[0,1] if attachment.image? %>

仅显示例如第一张图片,但我不再工作了(这确实很奇怪)。

EDIT 在模特中使用:

page.rb

class Page < ActiveRecord::Base
attr_accessible :name, :title, :body, :image, :text1, :text2, :text3, :text4
has_many :attachments
end

event.rb

class Event < ActiveRecord::Base
attr_accessible :image, :name, :date, :description, :event_id
has_many :attachments
has_many :event_attendees 
has_many :attendees, :through => :event_attendees, :source => :user
validates_presence_of :name, :date
end

attachment.rb

class Attachment < ActiveRecord::Base
 IMAGE_SIZES = {
:default => [280, 480],
:mini => [300,900],
:home => [200, 100]
}
attr_accessible :event_id, :page_id, :name, :image, :remote_image_url, :size 
belongs_to :event
belongs_to :page    

mount_uploader :image, ImageUploader
end

2 个答案:

答案 0 :(得分:0)

我看到的方式如下:

要保持用户体验,您需要存储无限制的附件,并限制模型级别的附件数量(在回调时)


加入模型

我在多态连接模型中有一个many-to-many关系,如下所示:

#app/models/image.rb
Class Image < ActiveRecord::Base
    has_many :image_pages
    has_many :pages, through: :image_pages
end

#app/models/image_page.rb
Class ImagePage < ActiveRecord::Base
    belongs_to :image
    belongs_to :page
end

#app/models/page.rb
Class Page < ActiveRecord::Base
    has_many :image_pages
    has_many :images, through: :image_pages, limit: :page_limits

    private
    def page_limits 
        "3" # -> put page validation here
    end
end

这将允许您将任意数量的图像与任意数量的页面相关联,也意味着您可以限制每页返回的图像


查看

您可以像这样调用图像:

#app/views/pages/show.html.erb
<% @page.images.each do |image| %>
    <%= image.attachment.url %>
<% end %>

当然,您可以限制上传级别,但这会阻止用户拥有他们喜欢的尽可能多的图片。至少通过限制模型级别,您将能够拥有任意数量的图像

这是一个很好的参考资料:limit the number of objects returned in a has_many

答案 1 :(得分:0)

通过将图像从数组中取出来解决了我的问题。

<% image_tag @event.attachments[1].image_url %>

使用这段代码我可以选择例如图像2(0计数,所以这是第二张图像)。 该代码可在选择的视图中使用。