2012-03-29 17 views
5

Así que he usado la lógica en el "Railscast" de "autenticación desde cero" en http://railscasts.com/episodes/250-authentication-from-scratch y parece que funciona y puedo guardar un mensaje "Ha iniciado sesión como ..." en la parte superior de la página.Haciendo referencia al usuario actual en Ruby on Rails

Pero si quiero hacer algo como registrar quién envió una publicación, he topado con un pequeño muro.

No quiero enviarlo a través de un campo oculto en el nuevo formulario de publicación, porque creo que hay problemas de seguridad con eso.

No quiero utilizar la lógica "pertenece a" en el tutorial de rieles al http://ruby.railstutorial.org/ruby-on-rails-tutorial-book porque aunque técnicamente funcionaría aquí, podría en el futuro necesitar registrar quién creó una entrada donde la relación "pertenece a" no existe

Lo que intenté hacer fue crear una llamada a la función "antes de guardar" en mi modelo de publicación que asigna un valor "created_by", pero supongo que los modelos no pueden acceder al usuario actual que se creó según la autenticación de transmisión de rieles.

Así que ahora no tengo ni idea de cómo hacer algo como esto.

EDITAR: Nuevo en Ruby, nuevo en ERD, todo eso, pero lo que quiero decir con pertenecer a la relación no existe es si hubiera, digamos, un sistema de clasificación de publicaciones, cada calificación pertenecería a una publicación . Pero también me gustaría registrar quién envió cada calificación.

+0

¿Puede ampliar esta declaración?"Es posible que en el futuro necesite registrar quién creó una entrada donde la relación" pertenece "no existe". – James

+0

http://stackoverflow.com/questions/1568218/access-to-current-user-from-within-a-model-in-ruby-on-rails http://stackoverflow.com/questions/2513383/access- usuario-en-modelo actual –

Respuesta

7

Si entiendo bien el problema que tiene es el hecho de que no puede ver qué usuario está utilizando actualmente Loggen método current_user ayudante en su modelo, sólo puede establecer el atributo created_by del poste en el controlador Post antes de guardar él, algo así como:

def create 
    @post = Post.new(params[:post]) 
    @post.created_by = current_user.id 
    if @post.save 
    redirect_to whereyouwant_url, :notice => "Post successfully created" 
    else 
    render "new" 
    end 
end 
+0

Gracias, sospeché que algo como esto debería ser posible, tal vez incluso he visto un ejemplo de esto antes, pero Rails es un poco abrumador hasta ahora. Estoy bastante seguro de que esto es exactamente lo que necesito. – user1299656

+0

durante la actualización, necesitamos pasar este mismo? porque estoy obteniendo el created_by eliminado durante la actualización .. :( –

0

Ok, no está seguro de lo que las complicaciones existe, pero aquí va:

por lo addind un belongs_to hace que el mensaje tiene un campo llamado user_id que es una clave externa para la identificación del usuario. si agrega un creado por, esto haría lo mismo, excepto que tendría que programar la actualización y deshacerse de usted mismo. Creo que esta es probablemente la mejor manera de obtener esta funcionalidad, y solo tendrías que agregarla más adelante a las partes que no la tienen, pero los rieles hacen que sea más fácil.

class User < ActiveRecord::Base 
    has_many :posts 
end 

class Post < ActiveRecord::Base 
    belongs_to :user, :as => :created_by 
end 



post.created_by 
user.posts 

le dará acceso a ese usuario, y es que este es equivalente a usar lo que hablaron, excepto los carriles haría su magia y añadir métodos para usted.

EDITAR: si esto no funciona para usted, lo siento, su pregunta no era clara sobre por qué necesitaba ciertas cosas, pero siempre puede agregar pertenece a la relación bastante fácil, eso es lo que yo recomendaría.

+0

Técnicamente esto funcionaría, y no he tenido ningún problema con él. Mi preocupación es que si necesito más de una clave externa en otras áreas, esto será un problema. Si tuviera clasificaciones de publicación, por ejemplo, necesitaría que cada calificación pertenezca a una publicación, pero también me gustaría un registro de quién envió cada una. ¿Es posible tener más de una relación "pertenece a" y llenar ambas claves foráneas de esta manera? – user1299656

+0

por lo que entiendo, sí, eso funcionaría. Tengo modelos con 4 pertenece a y 2 has_manys, solo agrega más columnas, post_id, submitter_id, rating_id, etc. – loosecannon

0

(alternativa a Giambelluca respuesta '' xoen Aldo)

Creo que se debe utilizar una relación belongs_to según ha explicado Loosecannon, pero si realmente no quiere, añadir el método siguiente en su clase User:

def new_post(params) 
    post = Post.new(params) 
    post.created_by = id 
    post 
end 

y en su controlador:

def create 
    @post = current_user.new_post(params[:post]) 
    if @post.save 
    redirect_to @post, notice: 'Post successfully created' 
    else 
    render 'new' 
    end 
end