Devise controller

Cześć, mam pytanie jak w akcji create po wykonaniu save dowiedzieć się jakie id ma user. Potrzebuję dodać stan konta do usera zaraz po rejestracji wydaje mi się że to jest najlepsze miejsce gdzie to można dodać. Relacja jest User posiada jedno konto czy jak kto woli rachunek rozliczeniowy .

[code] def create
build_resource

  if resource.save
    if resource.active_for_authentication?
      set_flash_message :notice, :signed_up if is_navigational_format?
      sign_in(resource_name, resource)
      respond_with resource, :location => after_sign_up_path_for(resource)
    else
      set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_navigational_format?
      expire_session_data_after_sign_in!
      respond_with resource, :location => after_inactive_sign_up_path_for(resource)
    end
  else
    clean_up_passwords resource
    respond_with resource
  end

end[/code]

A nie lepiej w before/after _save w modelu User?

Ok, pewnie i tak (nawet o tym nie pomyślałem). Może jakaś wskazówka jak to zrobić bo za bardzo nie wiem, znaczy wiem jak działa before/after save lecz nie wiem jak taka metoda miała by wyglądać co by mi tworzyła nowy rachunek z id usera.

Nie oczekuję gotowego kody a raczej jakieś wskazówki lub kawałka przykładowego kodu.

mam coś takiego:

def add_account n_account = Account.new self.n_account.name = "testowy" self.n_account.balance = 0 self.n_account.user_id = id self.n_account.save end end
i wywala mi błąd:
undefined method `name=’ for []:ActiveRecord::Relation
jak zrobie tak:

 self.n_account = Account.new

to mam taki błąd:
undefined method `each’ for #Account:0x007ff7ac2e8488

self.n_account.build(name: 'foo', balance: 0)

?

[quote=zlw]self.n_account.build(name: 'foo', balance: 0)
?[/quote]
Niestety dalej mam błąd :undefined method `each’ for #Account:0x007faefab51020
Model wygląda tak :

[code]class User < ActiveRecord::Base

after_save :add_account

Include default devise modules. Others available are:

:token_authenticatable, :confirmable,

:lockable, :timeoutable and :omniauthable

devise :database_authenticatable, :registerable,
:recoverable, :trackable, :validatable, :confirmable, :timeoutable

Setup accessible (or protected) attributes for your model

attr_accessible :email, :password, :password_confirmation

has_many :accounts

def add_account
self.n_account = Account.new
self.account.build(name: ‘test’, balance: 0, id:id)
end
end[/code]

Skoro masz relację “accounts”, to skąd pomysł na wołanie metody “n_account”?
Po prostu musisz zbudować obiekt dowiązany relacją:

acc = self.accounts.new acc.name = "cośtam" acc.save

[quote=Tomash]Skoro masz relację “accounts”, to skąd pomysł na wołanie metody “n_account”?
Po prostu musisz zbudować obiekt dowiązany relacją:

acc = self.accounts.new acc.name = "cośtam" acc.save
[/quote]
Dzięki, też mi się wydawało dziwne wołać self.n_account.build(name: ‘foo’, balance: 0) i de facto nie działało. Już wszystko śmiga tak jak trzeba. Dzięki za pomoc.

Działałoby jakbyś miał taką relacje (skąd w takim razie self.n_account?) :wink: Następnym razem pokaż wiekszy kawałek kodu, będzie łatwiej Ci pomóc :slight_smile:

przecież n_account w moim kawałku kodu to zmienna :stuck_out_tongue_winking_eye:

n_account = Account.new

Nie zmienia to faktu że jak bym wkleił od razu całą klasę to może by nie było problemu.

Dzięki za link.

no to zdecyduj się, bo raz n_account to zmienna lokalna, a raz akcesor (self.n_account) :wink: