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
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| %>
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