Edycja komentarza

Mam stronke ze zdjeciem pod ktorym moge wyswietlac i ukrywac komentarze za pomoca Ajaxa:

show.html.erb w kontrolerze photo


<%= link_to_remote “Pokaż komentarze:”, :update => ‘comments’,
:url => {:controller => ‘comment’, :action => ‘comments_show’}, :failure => “alert(‘Pojawił się błąd.’)”,
:complete => “$(‘comments’).show(); $(‘show_comments’).hide();$(‘hide_comments’).show();”, :with => “‘photo_id=#{@photo.id}’” %>


<%= link_to_remote “Ukryj komentarze:”, :update => ‘comments’,
:url => {:controller => ‘comment’, :action => ‘comments_show’ }, :failure => “alert(‘Pojawił się błąd.’)”,
:complete => “$(‘comments’).hide(); $(‘show_comments’).show();$(‘hide_comments’).hide();” %>




Plik wyswietlajacy wszystkie komentarze
_comments_show.rhtml

<% @comments.each do |com| %>


<% if @users[com.user_id-1].nil? -%>
Konto usunięte.
<% else -%>
<%= @users[com.user_id-1].screen_name %>
<% end -%>


<%= com.body %>
<% if (@user.id == com.user_id) or (@user.root) -%>

<%= link_to "Usuń komentarz ", :action => “delete”, :controller => “comment”, :comment_id => com.id %>

<% end -%>


<% end %>

w kontrolerze comment do wyswietlania mam funkcje

def comments_show
@comments = Comment.find_all_by_photo_id(params[:photo_id])
@users = User.find :all
@user = User.find(session[:user_id])
render :partial => “comments_show”
end

i tu jest na razie ok.

Teraz chce moc edytowac komentarz i robie tak:

w _comments_show.rhtml dodaje



<%= link_to "Edytuj komentarz ", :action => “edit”, :controller => “comment”, :comment_id => com.id %> /
<%= link_to "Usuń komentarz ", :action => “delete”, :controller => “comment”, :comment_id => com.id %>

a w kontrolerze comments_controller dodaje taka metode:


def edit
@comment = Comment.find(params[:comment_id])
if param_posted?(:comment)
if @comment.update_attributes(:comment)
redirect_to :controller => ‘photo’, :action => ‘show’, :id => @comment.photo_id
else
flash[:notice] = “Nie udało się zmienić komentarza”
redirect_to :controller => ‘comment’, :action => ‘edit’, :comment_id => @comment.photo_id
end
end
end

i tworze formularz do edytujacy komentarz:

<% form_for :comment do |form| %>
<%= error_messages_for “comment” %>

<%= form.text_area :body, :size => “30x5” %>


<%= form.submit “Aktualizuj” %>

<% end %>

I jak wyswietle ten komentarz i zmienie go, edytuje ale nie koniecznie text_area, w params mi wysyla, ale dostaje komunikat

Couldn’t find Comment without an ID

Parameters:

{“authenticity_token”=>“32cdb94170d766e3ff69469647b6c0b2cebc5729”,
“comment”=>{“body”=>“aaaa”},
“commit”=>“Aktualizuj”}

Prawdopodobnie to jest jakiś głupi błąd, ale nie mogę sobie z tym poradzić.
Proszę o pomoc.

form_for @comment jeśli edytujesz – to raz
musisz comment_id gdzieś zawrzeć, żeby aplikacja go dostała (w ścieżce albo hidden field w formularzu) – to dwa
zamień większość wystąpień :comment na @comment w swoim kodzie – to trzy (które wystąpienia zamienić pozostawiamy jako ćwiczenie dla czytającego :wink: )

poddaje sie. nie mam pojecia jak to zrobic. ;-/

zmienilem

_comments_show.rhtml

<% form_for :comment, :url => { :comment_id => @comment.id } do |form| %>
<%= error_messages_for “comment” %>

<%= form.text_area :body, :size => “30x5” %>


<%= form.submit “Aktualizuj” %>

<% end %>

i jest tak, ze ladnie mi wyswietla okienko i box do edycji, a w boxie tekst ktory moge usunac i napisac cos innego i jak naciskam przycisk
Aktualizuj to dostaje cos takiego:

can’t dup Symbol

C:/Program Files/NetBeans 6.5.1/ruby2/jruby-1.1.4/lib/ruby/gems/1.8/gems/activerecord-2.1.0/lib/active_record/base.rb:2354:in attributes=' C:/Program Files/NetBeans 6.5.1/ruby2/jruby-1.1.4/lib/ruby/gems/1.8/gems/activerecord-2.1.0/lib/active_record/base.rb:2261:inupdate_attributes’
app/controllers/comment_controller.rb:21:in edit' :1:instart’

Parameters:

{“authenticity_token”=>“a874987edc3f6d8b120a666c168e60cd66a7de08”,
“comment”=>{“body”=>“12343”},
“commit”=>“Aktualizuj”,
“comment_id”=>“7”}

a jak jeszcze zmienie

_comments_show.rhtml

<% form_for @comment, :url => { :comment_id => @comment.id } do |form| %>
<%= error_messages_for “comment” %>

<%= form.text_area :body, :size => “30x5” %>


<%= form.submit “Aktualizuj” %>

<% end %>

to nie zmienia mi pola w bazie danych, ani nic nie robi, zadnego bledu tez nie wywala…

“can’t dup Symbol” dotyczy ponizszego

if @comment.update_attributes(:comment)

powinno byc

if @comment.update_attributes(params[:comment])

Dokładnie o to chodziło.
:wink:

Dzięki wielkie wszystkim.
:wink:

Poratujcie bo już naprawdę nie wiem o co chodzi. Kontroler: [code]def edit
@user = User.find(params[:id])
end

def update
@user = User.find(params[:id])

  if @user.update_attributes(params[:user])
    flash[:notice] = 'Konto zostało edytowane.'
  else
    render :action => "edit"
  end

end[/code]
Widok: edit.html.erb [code] <%= error_messages_for :user %>

<% form_for @user do |f| -%>

Login
<%= f.text_field :login %>

Hasło
<%= f.text_field :password %>

Powtórz hasło
<%= f.text_field :password_confirmation %>

<%= submit_tag "Edytuj" -%>

<% end %>[/code]
Wywala błąd: You have a nil object when you didn’t expect it!
The error occurred while evaluating nil.to_sym
@user jest puste. Dałem nawet w kontrolerze helper_method :edit

a co masz w modelu?

no i nie ma sensu robic recznie, odpalasz sobie w konsoli

script/generate nifty_authentication

i tyle masz wszystko z automatu zrobione , trzba miec oczywiscie niftygenerators. Jak uzywasz haml i autlogic dajesz tak

script/generate nifty_authentication --authlogic --haml

zreszta polecam --help

masz tam kilka przydatnych rzeczy

ja to robię w sessnions_controller, a nie mam modelu session. Nie wiem o czym do mnie mówisz z tym “script/generate nifty_authentication”…
Jestem początkujący

@karol_mur: jeśli jesteś początkujący to mam prośbę: pisz proszę na forum Zielona szkoła i nie dodawaj postów do istniejących wątków tylko załóż nowy wątek, bo tak się robi niezły b**del. Czytałeś Rails Guides ?

@gotar: radzenie początkującemu, żeby skorzystał z nifty_authentication bez poznania podstaw jak działają Railsy to tak jak poradzenie komuś bez prawa jazdy, kto ma kłopoty z prowadzeniem po prostej drodze, żeby się przesiadł na Subaru Impreza bo się fajnie i szybko jeździ :slight_smile:

Bardziej mi chodziło by wywołał sobie generator i zrobił później diff między tym jak powinno być a jak jest.