2011-02-17 46 views
5

¿Cómo puedo lograr que un usuario solo pueda editar algunos campos de un registro?Permitir al usuario editar solo algunos de los campos en Ruby on Rails

Por ejemplo:

Un usuario puede registrarse en el sistema y seleccionar y especificar nombre de usuario, contraseña, etc. Sin embargo, un usuario registrado sólo puede editar su nombre, correo electrónico y contraseña, no su nombre de usuario.

Tengo una _forma parcial, que utilizo para funciones nuevas y de edición. Las miradas parciales como este:

<% form_for @user do |f| %> 
    <%= f.error_messages %> 
    <p> 
      <%= f.label :gruebl_employee_id %><br /> 
      <%= f.collection_select(:firma_employee_id, FirmaEmployee.find(:all).sort_by{|p| p.lastname.downcase},:id,:full_name, { :include_blank => "---keine Mitarbeiter---", :prompt => "---Bitte auswählen---"}, { :style => "width: 332px;"}) %> 
     </p> 
     <%= observe_field(:user_firma_employee_id, 
     :frequency => 0.25, 
     :url => { :action => :retrieveinfo }, 
     :with => "'id='+value") %> 

     <p> 
      <%= f.label :username %><br /> 
      <%= f.text_field :username %> 
     </p> 

     <p> 
      <%= f.label :admin, "Administrator ?" %><br /> 
      <%= f.check_box :admin %> 
     </p> 

     <p> 
      <%= f.label :email %><br /> 
      <%= f.text_field :email %> 
     </p> 
     <p> 
      <%= f.label :password %><br /> 
      <%= f.password_field :password %> 
     </p> 
     <p> 
      <%= f.label :password_confirmation %><br /> 
      <%= f.password_field :password_confirmation %> 
     </p> 
     <p><%= f.submit %></p> 
<%end%> 

Lo que estoy tratando de hacer es bloquear el usuario cambie el empleado y el atributo de nombre de usuario.

Gracias de antemano.

+0

¿Cuál es exactamente el problema que está teniendo? ¿Puedes publicar tu edición parcial? – JackCA

+0

<% form_for @user do | f | %> <% =% f.error_messages> – rgalindo33

+0

siento .. se encuentra el parcial sobre la cuestión editado .. gracias – rgalindo33

Respuesta

9

Tenga cuidado de esto en varios lugares.

En primer lugar, el uso attr_accessible en el modelo de usuario, para incluir sólo las que desee el usuario para editar:

attr_accessible :name, :email, :password, :password_confirmation #...

A continuación, en forma parcial, sólo se muestra el campo nombre de usuario cuando se muestra el formulario de registro:

 
<% if @user.new_record? %> 
    <%= f.text_field :username %> 
<% end %> 

por último, en la acción de crear, establecer manualmente el campo de nombre de usuario, ya que ahora está en la lista attr_accessible masa no se puede asignar:

 
@user = User.new(params[:user]) 
@user.username = params[:user][:username] 

Tenga en cuenta que si el nombre de usuario puede configurarse mediante asignación masiva, incluso si deshabilita el campo de nombre de usuario en el formulario, aún se puede modificar (es fácil cambiar el valor del campo en el formulario del cliente lado). Es por eso que tenemos que usar el attr_accessible para pretección.

Editar: se dio cuenta de su parcial, que es mejor para proteger el campo admin como nombre de usuario, de lo contrario los usuarios son capaces de establecer a sí mismos como administrador cambiando el valor de los campos en el lado del cliente.

+0

lo intentaré, pero ya tuve algunos problemas con attr_accessible al crear nuevos registros. Es decir, si el atributo no está en la lista, tampoco está incluido en el recuento cuando se crea por primera vez el registro. – rgalindo33

+0

ah es por eso que lo asigna manualmente ... ok ok ... lo probará todo. :) ¡Gracias! – rgalindo33

+0

gracias james, funciona como un encanto !. – rgalindo33

0

Como puedo ver, hay dos formas de hacerlo.

1 - Use el soporte html para hacer que el cuadro de texto sea de solo lectura. Así, en su caso, cuadro de texto nombre_usuario será algo como esto

<input type="text" name="user_name" value="<User Name>" readonly="readonly" /> 

2 - pero yo prefiero hacer algo como la creación de un cuadro de texto de sólo lectura en su ayudante aplicación raíles puede llamándolo como y cuando sea necesario

por lo el ejemplo sería

en mi ayudante aplicación

module ApplicationHelper 

    def read_only_text_field(object_name, method, options = {}) 
      text_field(object_name, method, :disabled => true) 
    end 
end 

y en mi opinión que tengo

<%= read_only_text_field :user, :user_name %> 

Creo que es más DRY/Railly.

** IMPORTANTE - y asegúrese de que doent cuenta el valor de sólo lectura de los controladores al guardar etc .. Y por el camino, incluso un usuario cambia estos valores de sólo lectura que aún están fuera de la molestia: D

espero que esta ayuda

aplausos

sameera

+0

ive bien pensado, la creación de un parcial diferente para editar la acción con la opción "desactivado" como dijiste . pero, ¿hay alguna forma de bloquear la edición desde dichos campos, quizás desde el controlador o el modelo en sí, para hacerlo más seguro? gracias – rgalindo33

+0

Hola, usuario617483, en ese caso, en lugar de hacer que el cuadro de texto sea de solo lectura, simplemente haga que sea una etiqueta. De acuerdo con mi ejemplo de método auxiliar, actualícelo para devolver una etiqueta inscrita en el cuadro de texto de solo lectura. Para asegurarlo Como dije, ignore esos valores al actualizar: D – sameera207

0

El truco es usar "objeto" junto con una etiqueta para cualquier cosa que no desee cambiar. Aquí es cómo debe codificarlo para el nombre de usuario:

<%= f.label(:username, f.object.username) %>