2013-02-13 2 views
1

У меня есть следующие модели:Rails 3.2.11 - создать связанный объект на лету

Document.rb

class Document < ActiveRecord::Base 

    belongs_to :order 
    attr_accessible :docfile, :print_format, :user_comment, :paper_type 
    has_attached_file :docfile, 
        :styles => { 
         :thumb => "100x100>" 
        }, 
        :url => "/order_documents/:order_number/:style/:id.:extension", 
        :path => ":rails_root/public/order_documents/:order_number/:style/:id.:extension" 

    validates_attachment_size :docfile, :less_than => 100.megabytes 
    validates_attachment_content_type :docfile, 
            :content_type => ['image/jpg', 'image/jpeg', 'image/png', 'application/zip', 'application/x-zip'] 

end 

Order.rb

class Order < ActiveRecord::Base 

    belongs_to :user 
    has_many :documents, :dependent => :destroy 
    accepts_nested_attributes_for :documents, :allow_destroy => true 

    DELIVERY_COMMENT_ROWS_SIZE = 2 
    DELIVERY_COMMENT_COLS_SIZE = 40 

    validates_associated :documents 
    validates :delivery_street, :delivery_address, :presence => true 

end 

У меня есть Orders_controller.rb:

class OrdersController < ApplicationController 

    def new 
    @order = Order.new 
    unless params[:add_document] 
     @order.documents.build 
    end 
    respond_to do |format| 
     format.html 
     format.js 
    end 
    end 

    def create 
    @order = Order.new(params[:order]) 
    current_user.orders &lt;&lt; @order 
    respond_to do |wants| 
     if @order.save 
     flash[:notice] = 'Заказ создан успешно.' 
     wants.html {redirect_to my_orders_path} 
     wants.xml { render :xml =&gt @order.to_xml } 
     else 
     wants.html { render :action => "new" } 
     wants.xml {render :xml =&gt @order.errors} 
     end 
    end 
    end 

end 

new.erb.html для "новых" действий:

<%= form_for @order, :url => orders_path, :html => { :multipart => true } do |order| %> 
    <%= order.fields_for :documents do |document| %> 
    <%= render :partial => "add_document", :locals => {:document => document} %> 
    <% end %> 

    <div id="documents"></div> 
    <%= link_to "add document...", new_order_path(:add_document => true), remote: true %> 
    <%= submit_tag 'save order', :class => 'submit' %> 
<% end %> 

и частичной _add_document.erb:

<%= document.file_field :docfile %> 
<%= document.select(:print_format, Document::PRINT_FORMAT) %> 
<%= document.select(:paper_type, Document::PAPER_TYPE) %> 
<%= document.text_area :user_comment, :rows => Document::USER_COMMENT_ROWS_SIZE, :cols => Document::USER_COMMENT_COLS_SIZE %> 

У меня есть проблема, чтобы создать новый документ для заказа «на лету» (с использованием JQuery). У меня есть new.js.erb:

$('<%= escape_javascript(render :partial => "add_document", :locals => { :document => @order.documents.build }) %>').appendTo($('#documents')); 

, но получаю сообщение об ошибке:

ActionView::Template::Error (undefined method `file_field' for #<Document:0x695c3d0>) 

Помощь пожалуйста. Какой код jquery я должен написать в файл new.js.erb? Спасибо.

ответ

1

Проблема заключается в этом фрагменте кода в вашем jQuery: :document => @order.documents.build.

Когда вы вызываете партию с :document => @order.documents.build, вы передаете экземпляр объекта Document, когда то, что вы действительно хотите передать, является объектом ActionView::Helpers::FormBuilder.

Возможно, вы захотите проверить this answer, это может помочь вам.

Кроме того, мне кажется, у вас есть логическая ошибка в вашем OrdersController:

Не следует так:

unless params[:add_document] 
    @order.documents.build 
end 

такой:

if params[:add_document] 
    @order.documents.build 
end 

Так как я полагаю, вы бы только хотят построить отношение, если передано {:add_document => true}.

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