2013-06-26 32 views
7

Tôi có 3 mô hình: báo giá, khách hàng và mục. Mỗi trích dẫn có một khách hàng và một mục. Tôi muốn tạo một báo giá mới, một khách hàng mới và một mục mới trong các bảng tương ứng của họ khi tôi nhấn nút gửi. Tôi đã xem xét các câu hỏi và railscasts khác và hoặc là họ không làm việc cho tình hình của tôi hoặc tôi không biết làm thế nào để thực hiện chúng.Ruby on Rails: tạo bản ghi cho nhiều mô hình với một biểu mẫu và một biểu mẫu

quote.rb

class Quote < ActiveRecord::Base 
    attr_accessible :quote_number 
    has_one :customer 
    has_one :item 
end 

customer.rb

class Customer < ActiveRecord::Base 
    attr_accessible :firstname, :lastname 
    #unsure of what to put here 
    #a customer can have multiple quotes, so would i use has_many or belongs_to? 
    belongs_to :quote 
end 

item.rb

class Item < ActiveRecord::Base 
    attr_accessible :name, :description 
    #also unsure about this 
    #each item can also be in multiple quotes 
    belongs_to :quote 

quotes_controller.rb

class QuotesController < ApplicationController 
    def index 
    @quote = Quote.new 
    @customer = Customer.new 
    @item = item.new 
    end 

    def create 
    @quote = Quote.new(params[:quote]) 
    @quote.save 
    @customer = Customer.new(params[:customer]) 
    @customer.save 
    @item = Item.new(params[:item]) 
    @item.save 
    end 
end 

items_controller.rb

class ItemsController < ApplicationController 
    def index 
    end 

    def new 
    @item = Item.new 
    end 

    def create 
    @item = Item.new(params[:item]) 
    @item.save 
    end 
end 

customers_controller.rb

class CustomersController < ApplicationController 
    def index 
    end 

    def new 
    @customer = Customer.new 
    end 

    def create 
    @customer = Customer.new(params[:customer]) 
    @customer.save 
    end 
end 

hình thức của tôi cho báo giá/new.html.erb

<%= form_for @quote do |f| %> 
    <%= f.fields_for @customer do |builder| %> 
    <%= label_tag :firstname %> 
    <%= builder.text_field :firstname %> 
    <%= label_tag :lastname %> 
    <%= builder.text_field :lastname %> 
    <% end %> 
    <%= f.fields_for @item do |builder| %> 
    <%= label_tag :name %> 
    <%= builder.text_field :name %> 
    <%= label_tag :description %> 
    <%= builder.text_field :description %> 
    <% end %> 
    <%= label_tag :quote_number %> 
    <%= f.text_field :quote_number %> 
    <%= f.submit %> 
<% end %> 

Khi tôi cố gắng trình mà tôi nhận được một lỗi:

Can't mass-assign protected attributes: item, customer 

Vì vậy, để thử và sửa chữa nó tôi cập nhật các attr_accessible trong quote.rb bao gồm: mục,: khách hàng nhưng sau đó tôi nhận được lỗi này:

Item(#) expected, got ActiveSupport::HashWithIndifferentAccess(#) 

Bất kỳ trợ giúp sẽ được đánh giá rất nhiều.

+0

Hãy thử tạo: tên và: mô tả có thể truy cập và: firstname và: lastname có thể truy cập trong các mô hình tương ứng của chúng. – lilwupster

+0

@lilwupster Tôi đã làm điều đó nhưng tôi vẫn nhận được các lỗi tương tự. – notblakeshelton

Trả lời

4

Để nộp một hình thức và nó là trẻ em đi kèm bạn cần phải sử dụng accepts_nested_attributes_for

Để làm điều này, bạn cần phải khai báo nó vào mô hình cho bộ điều khiển bạn sẽ sử dụng (trong trường hợp của bạn, nó trông giống như Trích Controller.

class Quote < ActiveRecord::Base 
    attr_accessible :quote_number 
    has_one :customer 
    has_one :item 
    accepts_nested_attributes_for :customers, :items 
end 

Ngoài ra, bạn cần phải chắc chắn bạn khai báo mà attributes are accessible vì vậy bạn tránh các lỗi phân khối khác.

+0

welp, tôi đặt accept_nested_attributes_for: khách hàng,: các mục và cũng đã thử: khách hàng,: mục nhưng dường như không hoạt động. – notblakeshelton

+0

Bạn đã kiểm tra để đảm bảo các thuộc tính có thể truy cập được (liên kết ở trên)? – creativereason

+0

yep tôi đã thử điều đó; nó đã không hoạt động, vì vậy tôi đã đi với attr_protected: id trên tất cả chúng để đảm bảo rằng tôi đã không bỏ lỡ bất kỳ, nhưng bây giờ nó spits ra lỗi "ActiveRecord :: AssociationTypeMismatch trong QuotesController # tạo
Item (#) dự kiến, đã ActiveSupport :: HashWithIndifferentAccess (#)" – notblakeshelton

1

Nếu bạn muốn thêm thông tin cho các mô hình khác nhau tôi đề nghị áp dụng nested_model_form li ke tham chiếu này: http://railscasts.com/episodes/196-nested-model-form-part-1?view=asciicast.

Giải pháp này rất đơn giản và rõ ràng nhất.

+0

Tôi có cần thay đổi các tệp mô hình của mình không? Đó screencast sử dụng một has_many, thuộc về mối quan hệ, trong khi tôi đang sử dụng has_one, và has_many, nhưng tôi không có ý tưởng nếu đó là đúng. Tôi đã thử thay đổi '@' trong các biến của tôi trong index.html.erb thành ':' nhưng nó không hoạt động. – notblakeshelton

Các vấn đề liên quan