NoMethodError in StoreController#save_order
undefined method `nr_domu=' for #<Order:0xc4b5f2>
Wszystkie nazwy w formularzach są takie jak w tabeli. Bez dodawania shipping_address wszystko działało normalnie.
Dzięki. Częściowo pomogło tzn w tabeli shipping_addresses pojawiają się nowe rekordy, ale nie pojawiają się dane wprowadzone z formularza, ani order_id i user_id
# == Schema Information
# Schema version: 8
#
# Table name: shipping_addresses
#
# id :integer(11) not null, primary key
# user_id :integer(11)
# order_id :integer(11)
# miasto :string(255)
# kod_p :string(255)
# ulica :string(255)
# nr_domu :integer(11)
# nr_mieszkania :integer(11)
W modelach relacje wyglądają tak
class User < ActiveRecord::Base
has_many :orders
has_many :shipping_addresses
class Order < ActiveRecord::Base
has_many :line_items
belongs_to :user
belongs_to :shipping_address
class ShippingAddress < ActiveRecord::Base
has_many :users
has_many :orders
nie zadziała bo próbujesz przypisać obiekt do integera. W ogóle “Rails Way” jest napisać current_user.orders.build(attributes) zamiast przypisywać w ten sposób id.
Pozmieniałem trochę formularz i teraz dostaję taki komunikat
NameError in Store#checkout
Showing app/views/store/checkout.rhtml where line #12 raised:
`@order[shipping_address_attributes][]' is not allowable as an instance variable name
Extracted source (around line #12):
9: <% fields_for 'order[shipping_address_attributes]' do |shipping_address| %>
10: <p><label for="shipping_address_kod_p">Kod pocztowy</label>
11: <%= shipping_address.text_field :kod_p, :size => 6 %>
12:
13: <label for="shipping_address_miasto">Mejscowość</label>
14: <%= shipping_address.text_field :miasto, :size => 40 %>
15: <p>
Kontroler wygląda tak
def checkout
if @cart.items.empty?
redirect_to_index("Twój koszyk jest pusty.")
@order = Order.new
@order.shipping_addresses.build
end
end
Model
def shipping_address_attributes=(shipping_address_attributes)
shipping_address_attributes.each do |attributes|
shipping_addresses.build(attributes)
end
end
Co do przypisania to na pewno masz rację, że w ten sposób się tego nie robi, ale w moim przypadku akurat zadziałało bo w sesjii jest tylko user_id i do tabeli orders pobiera właściwe.
Nie wiem ile jeszcze osób Ci napisze, żebyś nadrobił podstawy i dopiero potem brał się za kodowanie rzeczy których na razie nie ogarniasz – ale mam nadzieję, że w końcu to zrobisz
Co do meritum: order[shipping_address_attributes] nie jest w języku Ruby poprawnym odwołaniem do metody instancji. Co zresztą wypluł Ci interpreter.
Mogę Ci podpowiedzieć: order.shipping_address_attributes, bez ciapków ‘’ i ewentualnie z @ na początku (jeśli @order utworzyłeś w metodzie kontrolera). Ale obiecaj, że teraz pójdziesz i doczytasz, cobyś zrozumiał co tu się dzieje i nie zadawał tak grubych pytań. Bo jak nie, to znajdziemy jakiegoś złego pana moderatora, który wyśle Cię do kąta