Text_field_tag

Witam,

W widoku _form.html.erb mam:

text_field_tag :zip_code, @user.address.zip_code

i gdy edytuję usera to pole to się wypełnia odpowim kodem.

A gdy dodaję nowego to podczas wyświetlania strony new mam błąd:
undefined method `zip_code’ for nil:NilClass i nic w tym dziwnego.

Jak zrobić aby przy dodawaniu nowego to pole było puste a przy update wypełnione odpowiednimi danymi?

Kiedyś jak były dwa odręne pliki dla new i edit to

text_field_tag :zip_code, @user.address.zip_code

dodawałem tylko w editi, a w new:

text_field_tag :zip_code

Pozdrawiam

Najprościej jakimś ifem/unlessem, ale może jest jakaś magia więc niech “starsi” koledzy się wypowiedzą :stuck_out_tongue:

Chodzi też o to, aby zrobić to w właściwy sposób, a nie jakimś sztucznym trikiem.

Zakładając, że adres jest w osobnej tabeli i jest połączony relacją 1…1 z userem, to w akcji new utwórz powiązaną instancję modelu Address:

def new @user = User.new @user.address = Address.new (...) end
Rozwiązanie bardziej pro - nested_attributes, tutorial np. na: http://railscasts.com/episodes/196-nested-model-form-part-1

najlepiej chyba przes nested_attributes

[code=ruby]class User < ActiveRecord::Base
has_one :address
accept_nested_attributes_for :address
end

/app/views/users/_form.html.haml

= form_for @user do |f|
= f.text_field :email

= fields_for :address do |a|
= a.text_field :city
= a.text_field :zip_code[/code]
Nie musisz wtedy zupełnie nic zmieniać w kontrolerze. Zwykłe:

[code=ruby]@user = User.new(params[:user])
@user.save

czy

@user = User.find(params[:id])
@user.update_attributes(params[:user])[/code]
będzie działało.

Mam tabele Address:id, zip_code, name
Tabela ta jest wypełniona z góry. Nic się do niej nie dodaje teraz.

Mam tabelę User:id, name, address_id.

Mam widok z polami:

f.name i f.address_id oraz text_field_tag:zip_code który jest używany do ograniczenia pokazywanych możliwości wyboru przez selekta address_id.

Robię nowy:
Wpisuję w puste pola:
name: name1
text_field_tag: “99-000” - javascript na podstawie tego pola ogranicza możliwość wyboru address_id
addres_id: pokazuje tylko te z zip_code “99-990” zawsze jest ich wiele.
Do bazy zapisało się: name:name1 i address_id: np:121

i to jest ok.

Teraz robię update i chcę mieć w polu:
name:name1 i to jest ok
text_field_tag:zip_code “99-990” ponieważ address_id mam wybrane 121 a w bazie address 121 to właśnie zip_code "99-990"i to sie nie pokazuje
address_id:121

Mam nadzieję, że w miarę jasno to opisałem.
Póki co zrobię dwa osobne plik dla new i update bez korzystania z _field.

Pozdrawiam

Chyba znalazłem rozwiązanie na mój problem -> try. @user.address.try(:zip_code).
Rozwiązanie działa. Ale jak ktoś ma lepszy pomysł to chętnie przeczytam o nim.
Pozdrawiam