简体   繁体   中英

RoR - Searching gem for uploading files

I'm searching a gem (like paperclip or carrierwave) that allows you to upload images. But I want a relationship between the image and the otherside:

I have a table day

And I want a own table for the images so that at the and I'm going to have an has_many belongs_to relationship.

So one day has many images

any suggestions?

If I understand you correctly, you may want to look at the has_many :through relationship for this. We have this working with Paperclip & allows you to have many images to one record:

#app/models/day.rb
Class Day > ActiveRecord::Base
    has_many :day_images, :class_name => "DayImage"
    has_many :images, :class_name => "Image", :through => :day_images, dependent: :destroy

    accepts_nested_attributes_for :day_images, :allow_destroy => true
end

#app/models/day_image.rb
Class DayImage > ActiveRecord::Base
    belongs_to :day, :class_name => "Day"
    belongs_to :image, :class_name => "Image"

    accepts_nested_attributes_for :image, :allow_destroy => true
end

#app/models/image.rb
Class Image > ActiveRecord::Base
    has_many :day_images, :class_name => "DayImage"
    has_many :days, :class_name => "Day", :through => :day_images, dependent: :destroy
end

The join model would then look like this:

day_images table
id | day_id | image_id | extra attribute | extra attribute | created_at | updated_at

This would allow you to allocate images to the day model using the accepts_nested_attributes_for , like this:


Nested Models

Nested models are pretty tough to get right at first, but get easier the more you do them

Using the models I outlined above, you'll have to add several important factors to make accepts_nested_attributes_for work for you. Here's how:

#app/controllers/days_controller.rb
def new
    @day = Day.new
    @day.day_images.build.build_image
end

def create
    @day = Day.new(day_params)
    @day.save
end

private
def day_params
     params.require(:day).permit(:day, :variables, day_images_attributes: [:image_id, :extra_attributes, :in, :join, :model, image_attributes: [:image]])
end

This will allow you to create a form like this:

#app/views/days/new.html.erb
<%= form_for @day do |f| %>
    <%= f.text_field :day_attribute %>
    <%= f.fields_for :day_images do |day_image| %>
       <%= day_image.text_field :caption %>

       <%= day_image.collection_select(:image_id, Image.where(:user_id => current_user.id), :id, :image_name, include_blank: 'Images') %> --> this will allow you to assign images

       <%= day_image.fields_for :image do |i| %>
           <%= i.file_field :image %> --> uploads new image
       <% end %>
    <% end %>
<% end %>

This is all based off live code. If you need any more help, let me know!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM