Estrazione controller e action a partire da un uri

Ciao ragazzi,

qualcuno ha una idea su come si possono estrarre controller e action a
partire da un uri ? (naturalmente senza fare il parsing a manina
dell’uri…)

Faccio un esempio:

se io richiedo sulla view un uri tipo:

http://localhost:3000/companies/1/sites/1/articles/1/edit

e sulla view stampo i risultati ottengo:

<%= request.request_uri %> => /companies/1/sites/1/articles/1/edit
<%= controller.controller_name %> => articles
<%= controller.action_name %> edit

Questo perchè rails segue le regole presenti nella tabella di routing.

Il mio obiettivo è riuscire ad estrarre le info di controller e action
esattamente come le fa Rails ma “in anticipo” ovvero prima di richiamare
l’uri (questo perchè sto implementando un modulo di sicurezza basato su
controller/action che sulla base di determinati ruoli utente mi
controlla i permessi, non solo di richiamo dell’uri ma anche di
visualizzazione o meno di certi link nelle view).

Quindi mi piacerebbe fare una cosa del tipo:

controller, action = Classe.get_parameters(request.request_uri)

ma cosa devo richiamare ?

Grazie in anticipo…

On Mar 17, 2008, at 4:15 PM, Gianluca T. wrote:

Il mio obiettivo è riuscire ad estrarre le info di controller e action
esattamente come le fa Rails ma “in anticipo” ovvero prima di
richiamare
l’uri (questo perchè sto implementando un modulo di sicurezza basato
su
controller/action che sulla base di determinati ruoli utente mi
controlla i permessi, non solo di richiamo dell’uri ma anche di
visualizzazione o meno di certi link nelle view).

Non mi pare che Rails ti permetta di inserirti nel ciclo PRIMA del
parsing dell’url (a meno
di non andare con del monkey patching pesante…). Mettiamo che il
metodo che cerchi
esista, come pensavi di strutturare il codice?
Domanda forse banale… non fai prima a mettere un po’ di logica nelle
viste per non
fare l’output dei link “proibiti”?

S.

Non mi pare che Rails ti permetta di inserirti nel ciclo PRIMA del
Ml mailing list
[email protected]
http://lists.ruby-it.org/mailman/listinfo/ml

Grazie per la risposta,

volevo strutturare il codice in modo che sulla base dei ruoli gestiti a
livello di utente (es. @current_user.roles) il sistema controlli:

  1. Se posso chiamare un certo controler / action
  2. Non presenti certi link (di nuovo controllando controller / action)

Ammettiamo che io abbia una fase amministrativa in cui un utente possa
andare solo in modifica (:action edit e update) ma non in new/create e
destroy, sarebbe veramente brutto fargli vedere i link e poi a valle
dirgli che non ha autorizzazione all’esecuzione.

Volevo quindi crearmi un metodo comune che, partendo da un uri
(analizzando quindi request.request_uri) potesse estrapolarmi controller
e action così da applicare le logiche di controllo in un solo punto (DRY).

Quindi: controller:

check_security(request.request_uri, @current_user)

e view:

<%= link_tag_if check_security(company_site_article_path(@company,
@site, @article), @current_user), … %>

Grazie Carlo per la risposta, ho messo il dettaglio di cosa vorrei
ottenere nella risposta a Stefano…

Penso che si possa definire un before_filter in
controller/application.rb che si occupi di verificare il ruolo
dell’utente e la sua compatibilità con il controller e l’action
chiamati. Qualcosa del genere:

class ApplicationController < ActionController::Base
include AuthenticatedSystem # immagino…

before_filter :do_my_check

def do_my_check
current_user.can_access?(params[:controller], params[:action])
end

end

class User < ActiveRecord::Base
def can_access?(controller, action)

end
end

Per il display dei link invece mi pare che vada bene la soluzione di
Claudio. Certo, devi fare attenzione ad usare sempre l’helper,
altrimenti corri il rischio di esporre dei link, anche se poi il
before_filter impedirà l’accesso.

Potresti utilizzare appositi helper all’interno delle viste che ti
mostra o meno i link a seconda di CHI sta cercando di fare COSA…

2008/3/17, Stefano C. [email protected]:

Io uso un helper come questo:

Visualizza un link se l’utente e’ autorizzato

def link_to_if_authorized(name, options = {}, html_options = nil,
*parameters_for_method_reference)
if authorize_for(options[:controller] || params[:controller],
options[:action])
link_to(name, options, html_options,
*parameters_for_method_reference)
end
end

dove il metodo “authorize_for(controller, action)” mi controlla i
diritti su una coppia controller/action

l’helper viene usato nelle viste al posto di un normale “link_to”

<%= link_to_if_authorized ‘Prova questo link’, :action => :test, :id =>
… %>

Se l’utente non e’ autorizzato a quel link, il link semplicemente non
appare.

Ho un helper simile che, se l’utente non e’ autorizzato, visualizza
solo la label (non clickabile) al posto del link.

Ok Claudio, sono perfettamente d’accordo con te che con
link_to_if_authorize si possa risolvere il dilemma ma il problema mi
rimane,

infatti quando io passo l’url da chiamare es. /companies/1/sites/new non
so come estrarre action e controller, action e controller dovrei tirarli
fuori sulla base di quanto impostato nel routing map (map.resources) ma
come faccio ad estrarli ?

Su /companies/1/sites/new è anche facile sites è il controller e new
l’action ma ad esempio quando comincio ad avere
/companies/1/sites/1/articles il controller è articles e l’azione è
index, quindi mi piacerebbe utilizzare qualcosa che dato un uri mi
estraesse controller e action basandosi sulle regole di routing
impostate e non so cosa chiamare…

end
appare.

Ho un helper simile che, se l’utente non e’ autorizzato, visualizza
solo la label (non clickabile) al posto del link.


Gianluca T.
TreNetMediaMaster S.r.l.
The Internet Technology Company
Telefono +39(049)776196
Fax +39(049)8087806
Visit us @: http://www.trenet.it - http://www.mediamaster.it
e-mail me @: [email protected]

Ciao Luca,

il mio problema è quello di ricavare controller e action dentro un
helper a partire da un uri…

Nei controller è semplice perchè controller e action lo so che li ho in
params[:controller] e params[:action] ma dentro ad un helper come faccio
se ho solo un uri e voglio ricavare i 2 parametri ?

hmmm,

On Wed, Mar 19, 2008 at 3:39 PM, Gianluca T. <
[email protected]> wrote:

Su /companies/1/sites/new è anche facile sites è il controller e new
l’action

ma ad esempio quando comincio ad avere

/companies/1/sites/1/articles il controller è articles e l’azione è
index,

questo e’ il risultato dell’interpretazione delle regole di routing:
oltre a
scegliere il controller e l’action giusti, che ti ritrovi in
params[:action]
e params[:controller], vengono impostati altri valori nell’hash params,
ad
esempio params[:company_id] e params[:site_id] se nel caso in oggetto
hai
usato il routing restful standard

quindi mi piacerebbe utilizzare qualcosa che dato un uri mi
estraesse controller e action basandosi sulle regole di routing
impostate e non so cosa chiamare…

e’ questo che non capisco… quello che chiedi e’ gia fatto dal routing
che
interpreta l’uri estraendo il controller e l’action (che mette in
params) e
chiamando il metodo giusto… ma forse mi sfugge qualcosa (nota bene:
nell’esempio “/companies/1/sites/1/article” con routing restful,
l’eventuale
companies_controller e sites_controller NON entrano in gioco, tanto che
potresti anche non averli proprio ed usare map resources solo come mezzo
per
organizzare lo spazio delle URL :slight_smile: )

ciao,
Luca

On Wed, Mar 19, 2008 at 7:08 PM, Gianluca T. <
[email protected]> wrote:

Ciao Luca,

il mio problema è quello di ricavare controller e action dentro un
helper a partire da un uri…

Nei controller è semplice perchè controller e action lo so che li ho in
params[:controller] e params[:action] ma dentro ad un helper come faccio
se ho solo un uri e voglio ricavare i 2 parametri ?

Non ne sono sicuro ma questa soluzione può essere in parte quello che stai
cercando.
Nel libro The Rails Way, c’è un capitolo intitolato ‘Reflecting on Rails
Routing’ dove da console fanno vedere come controllare, testare, giocare
con
il routing. L’esempio che potrebbe esserti utile è questo

recognize_path(“users/3/bids/1”, :method => :get)
=> {:controller => “bids”, :user_id => “3”, :action => “show”, :id =>
“1”}

Credo ti possa andare bene, con l’unica differenza che se usi Restful,
devi
indicare anche il metodo (il quale influenza la scelta della azione da
richiamare).

Fammi sapere come và :wink:

GRANDIOSO ANDREA !!!

Era ESATTAMENTE quello che stavo cercando !!!

GRAZIE ALL’INFINITO !!!

params[:controller] e params[:action] ma dentro ad un helper come faccio

recognize_path(“users/3/bids/1”, :method => :get)

=> {:controller => “bids”, :user_id => “3”, :action => “show”, :id => “1”}

Credo ti possa andare bene, con l’unica differenza che se usi Restful, devi
indicare anche il metodo (il quale influenza la scelta della azione da
richiamare).

Fammi sapere come và :wink:


Gianluca T.
TreNetMediaMaster S.r.l.
The Internet Technology Company
Telefono +39(049)776196
Fax +39(049)8087806
Visit us @: http://www.trenet.it - http://www.mediamaster.it
e-mail me @: [email protected]

On Thu, Mar 20, 2008 at 9:08 AM, Gianluca T. <
[email protected]> wrote:

GRANDIOSO ANDREA !!!

Era ESATTAMENTE quello che stavo cercando !!!

GRAZIE ALL’INFINITO !!!

Mi fa proprio piacere vada bene.
Facciamo che mi pagherai una birra se mai ci si becca :smiley:

Buon lavoro.

Non solo birra ma anche pizza direi !!!

Ascolta, unico problema, ho provato a buttare su recognize_path sul
controller ma sembra che in rails 2 non trovi il metodo, ho provato a
vedere l’API di actionpack 2.0.2 ma sembra che il metodo non esista…,
ti risulta che l’abbiano tolto ?

Mi fa proprio piacere vada bene.
Facciamo che mi pagherai una birra se mai ci si becca :smiley:

Buon lavoro.


Gianluca T.
TreNetMediaMaster S.r.l.
The Internet Technology Company
Telefono +39(049)776196
Fax +39(049)8087806
Visit us @: http://www.trenet.it - http://www.mediamaster.it
e-mail me @: [email protected]

Scusa, trovato, dovevo solo fare questo:

ActionController::Routing::Routes.recognize_path(url)

La pizza e la birra restano invariati…

Ancora grazie !

Mi fa proprio piacere vada bene.
Facciamo che mi pagherai una birra se mai ci si becca :smiley:

Buon lavoro.


Gianluca T.
TreNetMediaMaster S.r.l.
The Internet Technology Company
Telefono +39(049)776196
Fax +39(049)8087806
Visit us @: http://www.trenet.it - http://www.mediamaster.it
e-mail me @: [email protected]

ciao,

On Thu, Mar 20, 2008 at 9:51 AM, Gianluca T. <
[email protected]> wrote:

Scusa, trovato, dovevo solo fare questo:

ActionController::Routing::Routes.recognize_path(url)

sto solo cercando di capire, magari mi sono perso qualcosa eh (in questo
caso scusatemi)…
ma perche’ usare questo metodo quando hai a disposizione direttamente
l’hash
params negli helper?
ad esempio prendi questo helper:

module ItemsHelper
def show_params
params.to_yaml
end

def other_show_params
ActionController::Routing::Routes.recognize_path(request.request_uri,
:method=>request.method).to_yaml
end
end

poi nella vista:

Params:

<%= show_params %>

<%= other_show_params %>

che mi mostra per l’url “/sites/1/items/4” :

Params:

— !map:HashWithIndifferentAccess
site_id: “1”
action: show
id: “4”
controller: items



:site_id: “1”
:controller: items
:action: show
:id: “4”

A me pare lo stesso no?

ciao,
Luca

Scusate ma controller.controller_name e amici non van bene?

Gianluca T. ha scritto:

Ciao Luca,

non sto parlando di controller/action che arrivano nei controller / view
/ helper ma di un problema diverso, ammettiamo che tu voglia verificare
un link:

<%= link_to_if_authorized “Modifica articolo”
edit_companies_sites_article(@comapny, @site, @article) %>

mediante un helper devo riuscire ad estrarre controller ed action a
partire dall’url presente nel link così posso vedere se per l’utente
corrente può chiamare il controller/action se può faccio vedere il lnk
altrimenti ciccia (stessa cosa poi faccio chiaramente anche nel
controller per garantire che l’utente possa chiamare controller e
action), credo che l’unico sistema sia analizzando l’url che mi arriva
dal link:

/companies/1/sites/1/articles/1/edit

mediante
ActionController::Routing::Routes.recognize_path(request.request_uri,
:method=>method) estraendo controller e action.

No, mi sto riferendo alla possibilità di visualizzare o meno un link
sulla base dell’url da chiamare…


Ml mailing list
[email protected]
http://lists.ruby-it.org/mailman/listinfo/ml


Gianluca T.
TreNetMediaMaster S.r.l.
The Internet Technology Company
Telefono +39(049)776196
Fax +39(049)8087806
Visit us @: http://www.trenet.it - http://www.mediamaster.it
e-mail me @: [email protected]