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: No Comments
17Nov/110

Creare un admin area in rails3 usando l’autenticazione scritta in devise

1)aggiungere il namespace "admin" in routes.rb, ed abbinarlo ai controller per i quali vogliamo l'autenticazione, in questo esempio "questions".

namespace :admin do
	match '/' => 'questions#index'
	resources :questions
end

2In views/layout creare il layout admin.html.erb specificando le parti che vogliamo mostrare nella sezione admin.
3) creare il controller admin_controller.rb in controllers/admin e utilizzare "autenticate_user" (vedere il tutorial su devise) per verificare che un utente sia loggato

class Admin::AdminController < ApplicationController
	layout "admin"
	before_filter :authenticate_user!
end

4) Sempre in controllers/admin, creare il file questions_controller.rb

class Admin::QuestionsController < Admin::AdminController
  def index
    @questions = Question.all
    respond_to do |format|
      format.html # index.html.erb
    end
  end
end

5)in views/admin creaimo la cartella "questions" e inderiamo tutte le views richieste dal controller controllers/admin/questions_controller.rb, in questo caso, solo il file index.html.rb
6
Le action dei form all'interno delle views in views/admin/questions devono rimandare ai controllers in controllers/admin/question controller. Quindi, sempre tenendo "question" come esempio da:

<%= form_for(@answer) do |f| %>

dobbiamo passare a

<%= form_for(:admin, @answer) do |f| %>
15Oct/110

creare un fork da un plugin su Github e svilupparlo come submodule

Sto sviluppando un'applicazione in CakePhp 2.0 e voglio usare dei plugin che sono ancora fermi alla versione 1.3 di CakePhp. Per ora, rinominare qualche cartella sembra essere sufficiente. Per tenere traccia del lavoro fatto e per far si che qualcun altro possa usufruirne, ho trovato molto utile "git sumbodule". Vediamo come creare un fork da un plugin e svilupparlo in locale come un submodule.
Per prima cosa installiamo la versione 2.0 di cake e inizializzamo un repository git.
Poi andiamo su github e scegliamo il plugin da adattare alla versione 2.0 di Cake, per esempio il plugin categories di CakeDc. Creiamo un fork con il bottone... fork. Poi Andiamo in "Admin", selezioniamo il repository appena forkato e diciamo a github quale deve essere il "default branch", in questo caso, scegliamo il 2.0.
Importante! quando cloniamo o installiamo come submodule un repo da github, questo si porta con appresso tutti i branches. Sta a noi decidere con "git checkout nomebranch" su quale branch lavorare.

Aggiungere il submodule

Dobbiamo dire a git di aggiungere un submodule contenente il codice del nostro fork, per esempio git@github.com:user/categories.git

git submodule add git@github.com:user/categories.git app/Plugin/Categories

Se vogliamo aggiungere solo un particolare branch, per esempio il 2.0, dobbiamo aggiunger il flag -b al comando precedente

git submodule add -b 2.0 git@github.com:user/categories.git app/Plugin/Categories

Poi spostiamoci nella cartella del plugin appena scaricato e diciamo a git dove e' il repository remote

cd app/Plugin/Categories
git remote add push git@github.com:user/categories.git

Proviamo a modificare un file del plugin, e sempre dalla cartella del plugin, eseguiamo il commit ed il push.

git add .
git commit -m "test commit"
git push master
Aggiungere l'indirizzo remote originario del repo forkato

Automaticamente, la nostra "origin" e' il nostro repo forkato su github, non il repo originario(quello di CakeDC in questo esempio).
Per dire a git di scaricare gli aggiornamenti fatti dagli sviluppatori di cakedc, dobbiamo aggiungere un altro remote.
sempre nella cartella del submodule

git remote add upstream git://github.com/CakeDC/categorie.git
Sincronizzare il nostro submodule con il repo originario forkato

Per scaricare gli aggiornamenti

git fetch upstream

Per fare un merge fra gli aggiornamenti appena scaricati da upstream ed il vostro repo in locale

git merge upstream/master

Per capire la differenza tra "git pull upstream" e "git fetch upstream", consiglio di leggere il punto "Pull in upstream changes" di questa guida.
Qui un link su stackoverflow riguardante questa parte.

Rimuovere submodules

Per rimuovere un submodule erronemente creato:
Delete the relevant line from the .gitmodules file.
Delete the relevant section from .git/config.
Run git rm --cached path_to_submodule (no trailing slash).
via Stackoverflow

Clonare un progetto contenente submodules
git clone git://github.com/user/progettoconsubmodules.git

Questo clonera' il progetto e la cartella del submodule, ma non il contenuto di quest'ultima. Per farlo lanciamo:

git submodule init
git submodule update

Altre info su questa parte nel git pro book