Вложени атрибути с помощта на релси за кламери 4

Аз съм нов в релсите и се опитвам да работя с вложени атрибути. Основната идея е да имате модел на сделка (оферта), сделката ще има множество deal_photos от кламер. Вече гледах Railscast на Ryan за вложени форми и прочетох много статии с много съвети относно проблеми по същия проблем, но все още не работи за мен.

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

    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") %>

(Мигрирах db за 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
Благодаря за отговора. Актуализирах въпросите, така че можете да видите deals_params. Да, виждам deal_id. - person gematzab; 16.06.2014
comment
Предполагам, че посещавате действието new_deal във вашия контролер. Така че @deal е нов екземпляр и deal_photos не получават deal_id. Вярно ли е? - 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| %>

Промененото е, че вторият ред е за конкретния случай на нова сделка. Може би причината първият да не работи е, че deal_photos не са получили deal_id, както каза Alexphys. Но все още не разбрах точната причина.

person gematzab    schedule 17.06.2014