Problem z edycją wpisu - Ajax

Otóż mój problem dotyczy tzw. “inline editing” (tak to się chyba nazywa)

Posiadając testową aplikację z jedyną tabelą “comments”, posiadającą dwa pola “title” i “content”, chcę stworzyć możliwość edycji w sposób płynny przy pomocy ajaxa. Akcje są oczywiście przygotowane do odbierania requestów javascriptowych itp. ale problem leży w samym wywołaniu akcji. Otóż mając wygospodarowany specjalny div (id: ‘edit’), gdzie ma się renderować akcja, staram się ustawić link, który to pociągnie.

Tak więc próbując:

<%= link_to_remote, ‘Edycja’, :update => ‘edit’, :url => {:action => :edit, :id => comment.id} %>
dostaję typowy błąd, który pojawia się po zastosowaniu nieznanej akcji, czyli (unknown action… no action responded to 432, actions: index, show, new …). Oczywiście ów numer to id komentarza. Próbując różnych sposobów do dobrania się do tej akcji, a nawet wskazując mu na siłę metodę get:

<%= link_to_remote, ‘Edycja’, :update => ‘edit’, :url => edit_comment_path(comment) %>
<%= link_to_remote, ‘Edycja’, :update => ‘edit’, :url => edit_comment_path(comment), :method => :get %>

pojawiają się problemy, albo w starym stylu, albo w przypadku wskazania metody, w określonym divie ‘edit’ renderuje się skrypt javascriptowy, zajmujący się bodajże obsługą błędów. Wszystkie te błędy oczywiście pojawiają się w polu przeznaczonym do renderowania.

Zdaję sobie sprawę, że mogę się za to zabierać z rzyci strony, albo nawet się totalnie kompromituję. Niemniej jednak nie udało mi się nigdzie znaleźć odpowiedniego przykładu, który by w mniej lub bardziej zbliżony sposób pokazywał jak zrobić to co ja właśnie próbuję. Tak więc, moje pytanie brzmi. W jaki sposób odwołuję się źle do tej akcji. Jak inaczej działa to w link_to_remote i co ewentualnie jest dodawane do tego adresu, że aplikacja nie potrafi tej akcji wyrenderować. Jakie są najlepsze sposoby aby tego dokonać. Będę wdzięczny za stratę czasu na odpowiedź.

Serdecznie pozdrawiam.

Pokaż akcję z kontrolera i routing.

Sprobuj
<%= link_to_remote, ‘Edycja’, :update => ‘edit’, :url => {:action => “edit”, :id => comment.id} %>

Jako, że to tylko aplikacja testowa, routing również ma oczywistą postać:
map.resources :comments

Akcja w kontrolerze:

def edit

@comment = Comment.find(params[:id])
respond_to do |format|
format.html
format.js
end

end

Ale oczywiście wydaje mi się, że układ mojej akcji nie jest istotny, gdyż problem jest z samym dostaniem się do niej, a nie z jej wnętrznościami.
A co do różnicy pomiędzy “edit”, a :edit, to w tym przypadku również chyba nie ma znaczenia. Co oczywiście sprawdziłem.

pokaż jeszcze co dostajesz w logach (szczególnie to jak składa paramsy)

czasami drugie czytanie pomaga :wink:

więc skoro pluje błędami javascriptowymi to może po prostu nie masz widoku z roszerzeniem rjs ?
oczywiście nie musisz go mieć, ale tak jest domyślnie

def edit @comment = Comment.find(params[:id]) respond_to do |format| format.html format.js { render :partial=>"nazwa-twojego-partiala"} # format.js { render :html=>"<p>działa :)</p>"} <= jeżeli chcesz szybko sprawdzić czy działa end end

można uzyć tego pluginu: http://github.com/rails/in_place_editing
wtedy cała składnia sprowadza się do czegoś takiego:

[code] # Controller
class BlogController < ApplicationController
in_place_edit_for :post, :title
end

View

<%= in_place_editor_field :post, ‘title’ %>[/code]

@phocke

Owszem, rozważyłem wcześniej brak widoku, więc próbowałem uruchamiać dowolny render, zarówno w kontrolerze, jak i w rjs. Główną sprawą jest to, że do wykonywania tej akcji wcale nie dochodzi i przeszkoda stoi wcześniej, w problemie samego wywoływania akcji. Ciekawi mnie jak sprawić, żeby ten skrypt javascriptowy, którego kod renderuje się w drugim przypadku, się jakoś wykonał. Z konsoli w firebugu nie jestem w stanie nic wywnioskować.

kod wygląda tak: try { } catch (e) { alert(‘RJS error:\n\n’ + e.toString()); alert(’’); throw e }

@marioosh

Owszem to też jest rozwiązanie, ale przynajmniej raz chciałbym to napisać szkieletowo. <:

Spróbuj zacząć od tego railscasta :slight_smile:
http://railscasts.com/episodes/136-jquery
http://asciicasts.com/episodes/136-jquery (tu w wersji tekstowej)

[quote=slawosz]Spróbuj zacząć od tego railscasta :slight_smile:
http://railscasts.com/episodes/136-jquery
http://asciicasts.com/episodes/136-jquery (tu w wersji tekstowej)[/quote]
Dawno go już widziałem. Warto zaznaczyć, że w tym tutorialu nie było potrzeby wywoływania żadnych akcji innych niż new za pomocą ajaxa. Z tą akcją też (o dziwo) nie mam problemu. Chodzi tutaj tylko i wyłącznie o edit.

a nie chodzi przypadkiem o to że edit przy domyślnych RESTowych routes łyka tylko GET a link to remote robi wywołanie POSTem ? spróbuj dodać

<%= link_to_remote, ‘Edycja’, :update => ‘edit’, :url => {:action => “edit”, :id => comment.id}, :method => :get, %>

Czytać czytać! :smiley: W pierwszym poście napisałem, że przy usilnym wskazaniu metody, renderuje mi skrypt JS z obsługą błędów w formacie tekstowym.

Czyżbyś używał naraz :update => ‘edit’ oraz template .rjs? Jak dla mnie to używa się albo-albo. Renderujesz partial HTML z opcją :update w linku ALBO renderujesz rjs (domyślnie) i wtedy nie używasz :update bo sam plik .rjs decyduje co i gdzie wstawi.

No oczywiście, że nie.

może po prostu wrzuc źródło na githuba, albo jak nie znasz gita to zraruj i daj na jakiś serwer
popatrze na to jak będę miał chwilę