0

Я работаю над вложенной формой, где пользователь при создании экрана должен также прикрепить изображение (отдельная модель под названием Скриншот). Я пытаюсь проверить наличие вложения перед сохранением нового экрана в db. Я попытался проверить наличие вложения в скриншоте, но это только снимок экрана, который нужно сохранить, пока он все еще создает экран.Проверка вложенных атрибутов (Paperclip)

Вот мои модели:

class Screen < ActiveRecord::Base 

    belongs_to :project 
    has_many :screenshots 

    validates :name, presence: true 

    accepts_nested_attributes_for :screenshots 

    validates_presence_of :screenshots 

end 


class Screenshot < ActiveRecord::Base 

    belongs_to :screen 

    has_attached_file :image, :styles => { :medium => "300x300>", :thumb => "100x100>" } 

end 

вот мой контроллер:

def create 
    @screen = Screen.create(screen_params) 
    if @screen.save 
     flash[:notice] = "A new screen has been added to this project" 
     redirect_to [@screen.project] 
    else 
     render :action => 'new' 
    end 
    end 

И, наконец, вот моя форма:

<%= form_for ([@project, @screen]), :html => { :multipart => true } do |f| %> 
    <% if @screen.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@screen.errors.count, "error") %> prohibited this screen from being saved:</h2> 

     <ul> 
     <% @screen.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <div class="field"> 
    <%= f.hidden_field :project_id %> 
    </div> 
    <div class="field"> 
    <%= f.label :name %><br> 
    <%= f.text_field :name %> 
    </div> 
    <div class="field"> 
    <%= f.label :description %><br> 
    <%= f.text_field :description %> 
    </div> 

    <%= f.fields_for :screenshots, @screen.screenshots.build do |s| %> 
    <%= s.hidden_field :screen_id, :value => @screen.id %> 
    <%= s.hidden_field :version, :value => "1" %> 
    <%= s.label :image %><br> 
    <%= s.file_field :image %> 
    <% end %> 

    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

Любая помощь в этом нуб очень ценится.

+0

validates_presence_of: изображение должно быть в модели Screenshot. Также убедитесь, что ваша вложенная форма работает. Попробуйте сохранить и посмотреть, загружается ли изображение. –

ответ

0

Несколько вещей для вас:

Форма Вы не должны строить новые объекты в самой форме. Это должно произойти в new функции контроллера

<%= f.fields_for :screenshots do |s| %> 
    <%= s.hidden_field :screen_id, :value => @screen.id %> 
    <%= s.hidden_field :version, :value => "1" %> 
    <%= s.label :image %><br> 
    <%= s.file_field :image %> 
    <% end %> 

Вы можете объявить их как это:

def new 
    @screen = Screen.new 
    @screen.screenshots.build 
    #any more build declarations go here 
end 

Проверка Я считаю, что вы должны поставить проверку в модель screnshots, как вложенные параметры передаются непосредственно соответствующей модели. Я не уверен в этом.

В модели скриншоты, я бы поставил validates_presence_of :screenshots, с именем, как имя вашего прикрепленного PAPERCLIP в

+0

Джо, спасибо за ваш ответ. Моя проблема с добавлением нового объекта в контроллер заключается в том, что после вашего примера поле не отображается в моей визуализированной форме. Любая идея о том, почему? –

+0

Для меня это выглядит как [@ project, @ screen]), что может быть проблемой. Вы показываете это представление во вложенном ресурсе @project? Я просто не вижу ссылки на @ project в вашем контроллере, и я чувствую, что Rails будет путаться из-за этого. Из вашего кода я просто использовал бы <% = form_for @ screen; но будет больше, чем просто –

+0

Да, форма вытягивается в представление шоу @project. В основном в проекте @ project у меня есть список всех экранов этого проекта, и у меня также есть форма для добавления новых. –

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