Restful authentication i aktualnie zalogowany user

Witam!

Od jakiegoś czasu interesuję się Ruby on Railsami (odmienia się?). Oglądnąłem prawie wszystkie screencasty na www.buildingwebapps.com i muszę powiedzieć, że powoli zaczynam to wszystko rozumieć, ogarniać (wcześniej dużo programowałem w PHP, tutaj czuję się lekko zagubiony). Szczególnie “oszołomiony” (pozytywnie :)) byłem po tym jak sie dowiedziałem jak prosto można tworzyć powiązane ze sobą tabele w bazach danych (has_many, belongs_to itp). Czuję, że to jest to i że szybko nie wrócę PHP :slight_smile:

Wracając do problemu - aby poćwiczyć zrobiłem sobie prostego cms, a dokładnie: logowanie via restful authentication, notki i komentarze. Z dodawaniem komentarzy jako gość (niezalogowany, pod formularzem jest pole input: user) jakoś sobie poradziłem, natomiast z dodawaniem jako zalogowany juz mam problem. Chciałbym aby wykrywało, że jestem zalogowany i pobierało id usera. Z pierwszą częścia nie miałem żadego problemu, natomiast drugą część próbowałem rozwiązać na wiele sposobów, niestety nie poradziłem sobie…

m.in.

include AuthenticatedSystem i AuthenticatedSystem.current_user w post/show.html.erb error: undefined method `current_user'
Users.current_user error w post/show.html.erb: uninitialized constant ActionView::Base::CompiledTemplates::Users
  • Czyli nie ma sposobu na bezpośrednie odwoływanie się do klas w cotrollerach?
    I jeszcze kilka podobnych…

Po prostu current_user.

Oczywiście, ze możesz wywoływać wszystko w kontrolerach.

Lol, zastrzele się chyba, a ja tyle czasu szukałem rozwiązania :stuck_out_tongue:
W każdym razie dzięki

Poćwicz na przykładzie Authlogica

Super tutoriale i ogromna konkurencja dla restful_authentication

tutorial do aktywacji po przez mail

http://github.com/matthooks/authlogic-activation-tutorial/tree/master

Niestety mam kolejny problem. Otóż mam taki formularz:

<% form_tag :action => 'add_comment', :post_id => @post.id do %> <%= text_area :comment, :text %><br /> <%= text_field :comment, :user_id unless logged_in? %> <%= submit_tag 'Dodaj!' %> <% end %>
I akcję add_comment

[code]def add_comment
@post = Post.find(params[:post_id])

if logged_in? then
  @user_id = current_user.id
end

@post.comment.create(:text => i_co_tu_dać?, :user_id => @user_id)

redirect_to :action => 'show', :id => @post.id

end[/code]
user_id to id użytkownika ALBO nazwa użytkownika, w przypadku gdy ktoś jest niezalogowany (to tylko do nauki więc tym że ktoś wpisze liczbę się nie przejmuję). Nazywa się tak, dlatego, że na początku zapomniałem o tym, że będą komentarze wpisiwane jako gość.

@post.comment.create(:text => i_co_tu_dać?, :user_id => @user_id)” -> i tu jest problem, czytałem na temat params w dokumentacji ale nic konkretnego nie piszę. Próbowałem roziwązać to wpisują @post.comment.create(params[:comment]), ale jak przekazać dane o użytkowniku bez ukrytego pola w formularzu itp.

@Tommy, dzięki - na pewno skorzystam, tylko najpierw chcę rozwiązać te wszystkie problemy. W końcu piszę to by się nauczyć :wink:

EDIT: Dobra, poradziłem sobie - uświadomiłem sobie, że params zwraca zwykłą tablicę :slight_smile:

<% form_tag :action => 'add_comment', :post_id => @post.id do %> <%= text_area :comment, :text %><br /> <%= text_field :comment, :user_id unless logged_in? %> <%= submit_tag 'Dodaj!' %> <% end %>

[code]def add_comment
@post = Post.find(params[:post_id])

if logged_in? then
  @username = current_user.id.to_s
else
  @username = (params[:comment].values_at "user_id").to_s
end

@text = (params[:comment].values_at "text").to_s

@post.comment.create(:text => @text, :user_id => @username)

redirect_to :action => 'show', :id => @post.id

end[/code]

To raczej nie jest najlepsze rozwiązanie. Pytania jakie mi się nasuwają to wersja Rails, gdzie trzymasz user_id (rozumiem, że w komentarzu ale myli trochę budowanie tej zmiennej @username ).
Jeśli 1.x zobacz screencast blog w 15 minut (na stronie głównej rubyonrails.com)
Jeśli 2.x zobacz może to: http://www.vimeo.com/425800

Warto uczyć się na przykładach, może redmine:
http://redmine.rubyforge.org/svn/trunk/app/controllers/news_controller.rb
zobacz na akcję add_comment. zmienna @news dostępna jest dzięki:
before_filter :find_news, :except => [:new, :index, :preview]
i prywatnej metodzie find_news

pozdrawiam