Non saprei dire se si tratta di un bug o di una funzionalità non
supportata: avevo trovato il modo per personalizzare le viste (anche se
non presente nella documentazione) per personalizzare gli scope ma
successivamente mi sono accorto che non funzionano più i filtri e
nemmeno il sort.
L’esempio è molto semplice, ogni user ha un gruppo e l’elenco degli
articoli ha diverse liste (scopes) per visualizzare quelli di competenza
al gruppo, quelli non assegnati (ma potenzialmente potrebbe visualizzare
anche quelli di uno specifico gruppo ecc.)
ActiveAdmin.register Article do
scope :assigned, :default => true do
Article.assigned.where(:group_id => current_user.group_id)
end
scope :unassigned
end
class Article < ActiveRecord::Base
belongs_to :group
attr_accessible :group_id, :user_id, :title
scope :assigned, where(Article.arel_table[:group_id].not_eq(nil))
scope :unassigned, where(:group_id => nil)
end
il problema del codice sopra è il passaggio del blocco al metodo scope
che da quanto ho capito non utilizza tutta la catena che appende le
opzioni all’oggetto relation.
ho aperto un ticket ma per il momento non posso farci affidamento ed io
purtroppo non sono in grado di porre rimedio:
Mi dispiacerebbe rinunciare ad activeadmin non solo perchè ci ho già
perso del tempo ma perchè mi piace molto, dunque vorrei trovare un altro
sistema per risolvere, devo in sostanza tornare al sistema classico:
ActiveAdmin.register Article do
scope :assigned, :default => true
scope :unassigned
end
prendendo spunto da qualche questione simile trovato sul web ho pensato
ad una soluzione alternativa ma vorrei condividerla con voi prima di
avere sorprese in produzione.
Questo è il modello aggiornato da cui si dovrebbe già capire l’idea:
class Article < ActiveRecord::Base
belongs_to :group
attr_accessible :group_id, :user_id, :title
cattr_accessor :current_user
scope :assigned, lambda{ where(:group_id =>
current_user.try(:group_id))}
scope :unassigned, where(:group_id => nil)
end
e nell’application controller associo il current_user ad ogni richiesta:
class ApplicationController < ActionController::Base
protect_from_forgery
before_filter :set_current_user
def set_current_user
Article.current_user = current_user
end
end
Tralasciando il fatto che se Article.current_user non è valorizzato
estrae la stessa cosa di :unassigned (è un problema risolvibile),
cattr_accessor crea una variabile di classe condivisa con tutti ed anche
se il numero di utenti è basso, circa una decina contemporaneamente, è
una soluzione che mi lascia perplesso.
Con rails >=3.2 si ha un comportamento in sviluppo simile
alla produzione, debuggando e simulando diversi utenti di gruppi diversi
sembra funzionare.
Commenti o qualche altra idea?