2014-08-10 2 views
1

Я могу загрузить файл с использованием несущей, как показано в следующем коде. Как отредактировать код, чтобы можно было загружать изображения до 3 файлов в одной статье?Rails 4: Как загрузить несколько изображений с использованием несущей волны

просмотров \ Статьи \ new.html.erb

. 
. 
<div class="span8"> 
    <%= render 'shared/article_form' %> 
</div> 
. 
. 

просмотров \ Shared \ _article_form.html.erb

. 
. 
<%= form_for(@article) do |f| %> 
    <div class="field"> 
    <%= f.hidden_field :category_id %> 
    <%= f.fields_for :photos do |p| %> 
    <%= p.hidden_field :article_id %> 
    <% if p.object.image and p.object.image.file %> 
     <%= image_tag p.object.image.thumb.url %> 
     <p><%= p.object.image.file.filename %></p> 
    <% end %> 
    <%= p.file_field :image %> 
    <% end %> 
    <%= f.text_area :content, placeholder: "Enter contents..." %> 
    </div> 
    <%= f.submit class: "btn btn-large btn-primary" %> 
<% end %> 
. 
. 

\ модели \ article.rb

class Article < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :category 
    has_many :photos, dependent: :destroy 
    accepts_nested_attributes_for :photos 
    . 
    . 
end 

\ модели \ фото.rb

class Photo < ActiveRecord::Base 
    belongs_to :article 
    mount_uploader :image, ImageUploader 
    validates :image, presence: true 
end 

\ Контроллеры \ articles_controller.rb

class ArticlesController < ApplicationController 
    . 
    . 
def new 
    @article = Article.new 
    @category = Category.find(params[:category]) 
    @article.category_id = @category.id 
    @article.photos.build 
end 

def create 
    @article = current_user.articles.build(article_params) 
    if @article.save 
    flash[:success] = "article created!" 
    redirect_to current_user #root_url 
    else 
    @feed_items = [] 
    render 'new' 
    end 
end 

def edit 
    @article = Article.find(params[:id]) 
end 

def update 
    @article = Article.find(params[:id]) 
    if @article.update(article_params) 
    redirect_to current_user 
    else 
    render 'edit' 
    end 
end 
    . 
    . 
private 

    def article_params 
    params.require(:article).permit(:content, :category_id, photos_attributes: [:id, :article_id, :image]) 
    end 
    . 
    . 
end 
+0

использование "гнездо" ed_form "или" кокон ". что сделает вашу работу намного проще. –

ответ

1

Изменить ваше новое действие к этому:

def new 
    @article = Article.new 
    @category = Category.find(params[:category]) 
    @article.category_id = @category.id 
    @photo = @article.photos.build 
end 

и в вашем file_field вам нужно использовать multiple option так вашу форму будет выглядеть так:

<%= form_for(@article,:html => { :multipart => true }) do |f| %> 
    // article fields 
    <%= f.fields_for @photo do |p| %> 
    <%= p.file_field :image, multiple: true %> 
    <% end %> 
<% end %> 

Update

Изменить новое действие и построить фото 3 раза

def new 
    @article = Article.new 
    @category = Category.find(params[:category]) 
    @article.category_id = @category.id 
    3.times { @article.photos.build } 
end 

и вашу форму

<%= form_for(@article,:html => { :multipart => true }) do |f| %> 
    // article fields 
    <%= f.fields_for :photos do |p| %> 
    <%= p.file_field :image %> 
    <% end %> 
<% end %> 

Также вы должны изменить свою модель немного тоже в порядке для отклонения пустых значений

class Article < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :category 
    has_many :photos, dependent: :destroy 
    accepts_nested_attributes_for :photos, reject_if: proc { |attributes| attributes[:image].blank? } 
    . 
    . 
end 
+0

Благодарим вас за комментарий Mandeep, но я не хочу использовать 'multiple: true'. Я хотел бы отобразить '<% = p.file_field: image%>' 3 раза в _article_form.html.erb и отправить эти изображения. – SamuraiBlue

+0

благодарим вас за ваш быстрый ответ. Я мог бы загрузить 3 файла, но я бы хотел загрузить хотя бы один файл. В обновленном коде 3 файла необходимы из-за 'validates: image, presence: true'. Как проверить один файл является обязательным? – SamuraiBlue

+0

@SamuraiBlue добавьте блок отклонения в вашу модель, а также сделайте выборочную проверку, в которой вы проверите наличие хотя бы одного изображения – Mandeep

0

Вы просто должны добавить :html => { :multipart => true } к вашему form загружать несколько файлов.

<%= form_for(@article,:html => { :multipart => true }) do |f| %> 

А также вы должны изменить эту строку <%= p.file_field :image %> в <%= p.file_field :image, :multiple => true %>

+0

Спасибо за ваш комментарий Pavan, но я не хочу использовать 'multiple => true'. Я хотел бы отобразить '<% = p.file_field: image%>' 3 раза в _article_form.html.erb и отправить эти изображения. – SamuraiBlue

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