2016-01-21 6 views
-1

Я хотел добавить фотографии в модель. У меня есть пользователи с Devise и они have_many Элементы, которые они продают.Ruby on Rails - Загрузка изображения

Теперь я хотел бы добавить массив изображений к модели Item (не уверен, что это лучший подход).

Я смотрел скрепку, но могу сделать только одно изображение. Также посмотрел на несущую волну, но не уверен, как реализовать существующую модель.

Вот некоторые из моих кодов.

item.rb

class Item < ActiveRecord::Base 
    belongs_to :user 

    validates :title, presence: true 
    validates :price, presence: true 
    validates :description, presence: true 
end 

items_controller.rb

class ItemsController < ApplicationController 
    before_action :findItem, only: [:edit, :update, :sold] 

    def index 
    @items = Item.all 
    end 

    def new 
    @item = Item.new 
    end 

    def create 
    @item = Item.create(item_params) 
    @item.user = current_user 
    if @item.save 
     flash[:success] = "Your item was successfully listed." 
     render 'show' 
    else 
     flash[:error] = "Your item could not be listed. Please try again." 
     render 'new' 
    end 
    end 

    def show 
    @item = Item.find(params[:id]) 
    end 

    def edit 
    end 

    def update 
    if @item.update(item_params) 
     flash[:success] = "Your item listing was updated successfully." 
     redirect_to item_path(@item) 
    else 
     flash[:error] = "Your listing was not updated. Please try again." 
     render 'edit' 
    end 
    end 

    def sold 
    @item.toggle(:sold) 
    @item.save 
    redirect_to item_path(@item) 
    end 

    private 
    def item_params 
    params.require(:item).permit(:title, :price, :description) 
    end 

    def findItem 
    @item = Item.find(params[:id]) 
    end 
end 

Форма для п/new.html.erb

<div class="row"> 
    <div class="col-xs-12"> 
    <%= form_for(@item, :html => {class: "form-horizontal", role: "form"}) do |f| %> 
     <div class="form-group"> 
    <div class="control-label col-sm-2"> 
     <%= f.label :title %> 
    </div> 
    <div class="col-sm-8"> 
     <%= f.text_field :title, class: "form-control", placeholder: "What are you selling?", autofocus: true %> 
    </div> 
    </div> 

    <div class="form-group"> 
    <div class="control-label col-sm-2"> 
     <%= f.label :price %> 
    </div> 
    <div class="col-sm-8"> 
     <%= f.number_field :price, class: "form-control" %> 
    </div> 
    </div> 

    <div class="form-group"> 
    <div class="control-label col-sm-2"> 
     <%= f.label :description %> 
    </div> 
    <div class="col-sm-8"> 
     <%= f.text_area :description, rows: 10, class: "form-control", placeholder: "Describe your item. The more detail you include, the more likely it is to sell." %> 
    </div> 
    </div> 

    <div class="form-group"> 
    <div class="center col-sm-offset-1 col-sm-10"> 
     <%= f.submit class: "btn btn-primary btn-lg" %> 
    </div> 
    </div> 
<% end %> 

<div class="center col-xs-4 col-xs-offset-4"> 
    <%= link_to "[ Cancel and return to listing page ]", items_path %> 
</div> 

ответ

0
#app/models/item.rb 
class Item < ActiveRecord::Base 
    has_many :images 
    accepts_nested_attributes_for :images 
    validates :title, :price, :description, presence: true 
end 

#app/models/image.rb 
class Image < ActiveRecord::Base 
    belongs_to :item 
    has_attached_file :picture 
end 

-

выше позволит создать Item, который будет иметь любое количество images, что вы хотите. Вы можете передать новый images через accepts_nested_attributes_for:

#app/controllers/items_controller.rb 
class ItemsController < ApplicationController 
    def new 
     @item = Item.new 
     @item.images.build 
    end 

    def create 
     @item = Item.new item_params 
     @item.save 
    end 

    private 

    def item_params 
     params.require(:item).permit(images_attributes: [:picture]) 
    end 
end 

#app/views/items/new.html.erb 
<%= form_for @item do |f| %> 
    <%= f.fields_for :images do |i| %> 
     <%= i.file_field :picture %> 
    <% end %> 
    <%= f.submit %> 
<% end %> 
+0

Вот именно то, что мне нужно. Я буду реализовывать его завтра и посмотреть, как это происходит. Для представлений они будут доступны с помощью «@ item.images.each», а затем итерации? –

+0

Если вы хотите * показать * загруженные изображения, вам нужно будет использовать '@item.images.each do | image | <% = image_tag image.picture.url%> end' - Я мог бы посмотреть, как вы делегируете метод 'picture.url' вашим изображениям, но поскольку это' has_many', это было бы довольно сложно –

2

Вы просто хотите создать модель изображения. И установите соотношение с товаром следующим образом: Itemhas_many :images, и Imagebelongs_to :item.

Но, да, скрепка - хорошее начало.

EDIT: О, и приветствуем Rails, вы найдете хорошее сообщество, готовое помочь. Вам также может быть полезно найти accepts_nested_attributes_for, чтобы вы могли загружать изображения в свою форму и cocoon, чтобы динамически добавлять и удалять изображения в форме элемента.

+1

Спасибо за ответ. Так я исправлю в предположении, что я бы создал ассоциацию так же, как ассоциировать «элемент» с «пользователем»? Сейчас я отправлюсь в Google и исследую «accepts_nested_attributes_for» и «cocoon». –

+0

Да, вы правы. Помеченный этот вопрос был решен, как только вы знаете, что мы ответили на ваш первоначальный вопрос. Если у вас есть новые вопросы, просто создайте новые вопросы с конкретной проблемой. – Leito

Смежные вопросы