Authlogic i błąd

czy ktoś się spotkał z takim błędem: (jechałem wg http://railscasts.com/episodes/160-authlogic )

Called id for nil, which would mistakenly be 4 – if you really wanted the id of nil, use object_id

c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.3.5/lib/action_controller/record_identifier.rb:76:in dom_id' c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.3.5/lib/action_view/helpers/record_identification_helper.rb:16:indom_id’
c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.3.5/lib/action_view/helpers/form_helper.rb:293:in apply_form_for_options!' c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.3.5/lib/action_view/helpers/form_helper.rb:277:inform_for’
C:/ruby/typer/app/views/users/_form.html.erb:1:in _run_erb_app47views47users47_form46html46erb_locals_form_object' c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.3.5/lib/action_view/renderable.rb:34:insend’

[code=ruby]Extracted source (around line #1):

1: <% form_for @user do |f| %>
2: <%= f.error_messages %>
3:


4: <%= f.label :username %>
[/code]
nie bardzo wiem dlaczego, tzn. wydaje się, że jakby brakowało @user = User.new, ale jak dodam to i tak nie pomaga, ale jest :

class UsersController < ApplicationController def create @user = User.new(params[:user])
???

Uh, podstawy panie, podstawy… REST.
typowy lifecycle: new -> create -> show -> edit -> update -> delete

W akcjach new/edit wyświetlasz formularze ktore sa przekazywane do akcji create/update.
Zauważ, że alcje new/edit są wywoływane metodą HTTP GET, co znaczy, że można je wywoływać wielokrotnie bez żadnych skutków na bazie danych. Dopiero create jest wywoływane z metodą POST (tworzenie rekordu) a update z metodą PUT (aktualizacja).

Wniosek? Formularz jest powiązany z metodą new kontrolera
Zadaniem metody create jest utworzenie rekordu na podstawie hasha przekazanego w params[:user].

POLECAM: http://www.rubyinside.com/rest-and-rails-the-best-ever-rails-screencast-262.html

bystrzacha ze mnie jak cholera :slight_smile:

dzięki @sevos za podpowiedź - teraz śmiga.

Chce zapisać w formularzu id zalogowanego usera.

Próbuje coś jakoś tak:

<%= f.label @user %><br /> <%= f.hidden_field (:user_id, :value => @userid) %>
@user = current_user.username
@userid = current_user.id

ale dostaje:

undefined local variable or method `persistence_token’.

current_user masz dostępne wszędzie i zawsze mozesz z nich korzystać w authlogic. Wystarczy więc. .

<%= f.label @user %><br /> <%= f.hidden_field (:user_id, :value => current_user.id) %>
No ale lepiej to dać w kontrolerze np. przy zapisie.

@user = User.new(params....) @user.user.id = current_user.id
no albo jeszcze inaczej

Jak by jednak nie działało to w application_controller.rb daj

[code=ruby] helper_method :current_user

private

def current_user_session
return @current_user_session if defined?(@current_user_session)
@current_user_session = UserSession.find
end

def current_user
return @current_user if defined?(@current_user)
@current_user = current_user_session && current_user_session.record
end[/code]
a tak poza tym to ten persistence_token to jedno z pol w bazie jakie powinienes miec, jest chyba wymagane przez authlogic. Dodaj je i tyle

Zdecydowanie zły, bardzo zły pomysł, przecież to ID można podmienić. Najlepiej umieścić odpowiedni kod w modelu w before_save (ostatecznie możesz to wrzucić do kontrolera, ale to chyba nie jest “rails way”). A jeszcze lepiej - jeśli masz odpowiednio ustawione relacje, to po prostu w kontrolerze zamiast czegoś w stylu:

@post = Post.new(params[:post])

wrzucić

@post = curren_user.posts.build(params[:post])