itora web

2Dec/110

Aggiungere una action ad un controller in rails3

Rails3 cread i default sette azioni per ogni controller generato dinamicamente.
Se vogliamo aggiungere un azione, che ne so, per aggiornare un solo valore nel database, per una nuova view, o per quasiasi altra cosa, dobbiamo:
1)Scrivere la nostra azione nel controller, in questo esempio scrivero' un azione per disapprovare un commento, settando a "0" il valore del campo "approved".

def disapprove
	@comment = Comment.find(params[:id])
	if ( @comment.update_attribute(:approved, "0"))
		respond_to do |format|
			format.html { redirect_to(admin_comment_url(@comment),
					:notice => 'Comment was unapproved.') }
			format.xml  { head:ok }
		end
	else
		respond_to do |format|
			format.html { render :action => "edit" }
			format.xml  {render:xml=>@comment.errors, :status => :unprocessable_entity }
		end
	end
end

Nel mio file routes.rb, dovro' dire alla mia app che oltre alle 7 azioni canoniche ce ne' un altra, disapprove. E dovro' specifivare che tipo di http request e', tra post, get, put e delete. Nel mio caso ho messo post, piu' dettagli qui

resources :comment do
	post 'disapprove',:on=>:member
end

Lanciando "rake routes" nella cartella della mia app, posso vedere la nuova route creata, e vedere quale e' l'url da utlizzare nell'helper. Nel mio caso l'approvazione dei commenti si trova nell'admin area.

disapprove_admin_comment POST   /admin/comments/:id/disapprove(.:format)              {:controller=>"admin/comments", :action=>"disapprove"}

Ora creaimo un link all'azione

<%= link_to 'Disapprove', disapprove_admin_comment_path(@comment)%>

Dopo aver generato questo link, ottenevo un errore "No route matches..." la mia azione.
Errore risolto specificando nel link il tipo di http verb

<%= link_to 'Disapprove', disapprove_admin_comment_path(@comment), :method=>'post' %>

Consiglio questi screencast, per capire come vengono generate le routes, 1 e 2

Tagged as: Leave a comment
Comments (0) Trackbacks (0)

No comments yet.


Leave a comment

(required)

No trackbacks yet.