Вложенные атрибуты с использованием направляющих для скрепок 4

Я новичок в рельсах и пытаюсь работать с вложенными атрибутами. Основная идея состоит в том, чтобы иметь модель сделки (предложения), сделка будет иметь несколько Deal_photos из скрепки. Я уже смотрел Ryan's Railscast для вложенных форм и читал много статей с множеством советов по проблемам по одному и тому же вопросу, но все же это не работает для меня.

Вот моя реализация:

    class Deal < ActiveRecord::Base
    belongs_to :user
    has_many :deal_photos, dependent: :destroy

    accepts_nested_attributes_for :deal_photos
    end


    class DealPhoto < ActiveRecord::Base
     belongs_to :deal
     has_attached_file :photo, :styles => { :large => "600x170", :medium => "250x250!",         :thumb => "100x100>" }, :default_url => lambda { |photo| photo.instance.set_default_url}

     def set_default_url
      ActionController::Base.helpers.asset_path('missing.png')
     end
    end

В моем контроллере сделок:

    class DealsController < ApplicationController
     def new_deal
  @deal=Deal.new()
      @user= User.find(params[:id])
      3.times { @deal.deal_photos.build }
     end

    def create
     @deal = Deal.new(deal_param)
     @user= User.find(params[:user_id])
     if @deal.save
        @user.deals << @deal
        flash[:notice]="Thank you"
     end
    end

    def edit
     @deal=Deal.find(params[:deal_id])
     3.times { @deal.deal_photos.build }
    end

    def update
     @deal=Deal.find(params[:id])
     if @deal.update_attributes(deal_params)
      flash[:notice]="Deal updated successfully"
     end
    end

    private
    def deal_params
    params.require(:deal).permit(:title, :description, :contact_num, :user_id,    :deal_photos_attributes => [ :id, :caption, :photo, :deal_id])
    end

Наконец в моей форме для новой сделки:

    <%= form_for(:deal, :url=>{:action=>'create', :user_id=> @user.id}) do |f| %>

      <label>Title<b style="color:red;">*</b>
      <%= f.text_field(:title, :placeholder=>"") %>
      </label>

---------------------------больше полей---------------------

      <%= f.fields_for :deal_photos do |builder| %>
        <div>
          <%= builder.label :caption, "Image Caption" %>
          <%= builder.text_field :caption %>

          <%= builder.label :photo, "Image File" %>
          <%= builder.file_field :photo %>
        </div>
      <%end%>

      <%= button_tag("Create", :class=> "secondary button", :button_type => "submit") %>

(Я перенес БД для Deals_photo, чтобы принять скрепку)

Приведенное выше создает форму со всеми полями, но вместо 3 входов для загрузки файла показывает только один. Он создает 3 пустых ассоциации @deal.deal_photos, но даже если я выберу одно изображение для загрузки из формы, оно не сохранит его. Если у вас есть полезные советы или другой подобный вопрос, пожалуйста, помогите!


person gematzab    schedule 16.06.2014    source источник


Ответы (2)


Что в вашем методе deal_param? Вы разрешаете в нем атрибуты Deal_photos? Если нет, то сделайте что-то вроде

def deal_params
 params.require(:deal).permit(deal_attr1, deal_attr2,...., deal_photos_attributes: [:deal_photo_attr1, ...])
end

Кроме того, вы видите deal_id в поле зрения deal_photos?

person Alexphys    schedule 16.06.2014
comment
Спасибо за ответ. Я обновил вопросы, чтобы вы могли видеть параметры сделки. Да, я вижу Deal_id. - person gematzab; 16.06.2014
comment
Я полагаю, вы посещаете действие new_deal в своем контроллере. Таким образом, @deal — это новый экземпляр, а Deal_Photos не получают идентификатор сделки. Это правильно? - person Alexphys; 16.06.2014
comment
Насколько мне известно, действие сборки является псевдонимом нового действия. Эта реализация создает 3 экземпляра и ассоциации между ними, но не создает три поля ввода. Генерируется только одно поле, и оно не загружает изображение, которое я выбираю.1 - person gematzab; 17.06.2014

Наконец, мне удалось решить проблему в new_deal.html.erb, когда я заменил:

    <%= form_for(:deal, :url=>{:action=>'create', :user_id=> @user.id}) do |f| %>

с участием

    <%= form_for(@deal, :url=>{:action=>'create', :user_id=> @user.id}) do |f| %>

Что изменилось, так это то, что вторая строка предназначена для конкретного экземпляра новой сделки. Возможно, причина того, что первый не работал, заключается в том, что, как сказал Alexphys, Deal_photos не получил Deal_id. Но до сих пор я не выяснил точную причину.

person gematzab    schedule 17.06.2014