2010-07-05 7 views
1

Je souhaite afficher un seul formulaire dans lequel chaque utilisateur peut modifier différents champs.Rails: champ modifiable/non modifiable en fonction des autorisations utilisateur

Actuellement, le code ressemble à ceci:

<% if can? :update, item %> 
` <%= f.text_field :title %> 
<% else %> 
    <%=h f.object.title %> 
<% end %> 

je peux emballer cela dans une série d'aides (un pour chaque type de terrain), mais je dois aussi vérifier dans le contrôleur si l'utilisateur peut mettre à jour tous les champs soumis (dans le cas où un utilisateur malveillant tente de soumettre des champs pour lesquels il n'est pas autorisé).

Y a-t-il un motif de nettoyage dans les rails pour ce type de tâche? Idéalement, je voudrais définir ces permissions d'accès dans le modèle et faire en sorte que les changements se propagent au contrôleur et à la vue.

Edit:

En utilisant la balise readonly est pas une option viable; Il ne prend pas en charge les validations et remplace la logique de vue par beaucoup de CSS. Pas le meilleur compromis.

Répondre

0

Vous pouvez les faire en lecture seule

<%= f.text_field :title, :readonly=> (can? :update, item)? true : false %> 
+0

Il est juste cosmétiques; Cela dépend si vous préférez écrire beaucoup de CSS (pour styliser les commandes en lecture seule comme s'il s'agissait de texte brut) ou si vous préférez une logique supplémentaire dans la vue. Et cela ne résout pas le problème de la validation côté contrôleur. – shmichael

0

Jetez un coup d'oeil au plug-in acl9 d'autorisation.

+0

Pour autant que je puisse le voir, ce n'est pas différent de l'autorisation déclarative ou du cancan: je dois encore implémenter toutes les différentes logiques dans le contrôleur/la vue. – shmichael

+0

Oui. J'ai réalisé que vous utilisez déjà un cadre d'autorisation. Je suppose qu'il n'y a pas échapper les contrôles de condition dans les contrôleurs. –

0

Je ne belive theres aucune façon de résoudre ce avec un plug-in, la seule option serait de modifier le code du contrôleur:

@model=Model.new 
@model.field = params[:model][:field] if can? .... 
@model.save 
Questions connexes