2011-12-12 14 views
9

Practico mi Ruby on Rails creando una aplicación simple donde los usuarios pueden registrarse (usando Devise) y publicar artículos.¿Cómo pasar el usuario actual de Devise como user_id?

Después de instalar Diseñar, sigo adelante y generar un andamio para los artículos

rails g scaffold article title:string article:text user_id:integer 

A continuación, se crea el controlador de usuario Diseñar

rails generate devise User 

Mi controlador de artículo:

class Article < ActiveRecord::Base 
    belongs_to :user 
end 

Mi controlador de usuario:

class User < ActiveRecord::Base 
    has_many :articles 

    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    attr_accessible :email, :password, :password_confirmation, :remember_me 
end 

Ahora mi pregunta es: ¿cómo se hace para que user_id en http://localhost:3000/articles/new/ sea automáticamente current_user.id?

Además, en http://localhost:3000/articles/ el usuario solo debería poder ver los artículos asociados con su user_id, no hay nadie más. ¿Qué cambios en el controlador de artículos debo hacer para hacer esto?

Es la primera vez que escribo aquí en Stack Overflow y su ayuda será apreciada ... ¡Muchas gracias!

EDIT encontró la solución a la primera pregunta, para referencia futura.

puse

<%= f.hidden_field :user_id %> 

en _form.html.erb y

def create 
    @article.user_id = current_user.id 
    ... 
end 

a mi controlador artículo. Esto está pasando satisfactoriamente el archivo current_user.id como el user_id del artículo perfectamente.

+0

Sea más específico. Tienes poco sentido. – clyfe

+0

Pensé que lo expliqué tan bien como pude ... pero está bien, TL; dr -> la tabla articles tiene 3 campos (título, artículo y user_id). Estoy preguntando cómo user_id en el formulario de creación puede = usuario_actual.id de Devise. – cdotfeli

Respuesta

4

Ahora mi pregunta es: ¿cómo hacer para que user_id en http://localhost:3000/articles/new/ es automáticamente current_user.id?

Usted debe agregar a la articles_controller "def nueva" esta línea @ ask.user_id = current_user.id

por lo que entonces form_for @ask pide la propiedad user_id de @ask y la muestra. Pero yo no recomiendo hacer esto en una aplicación en el mundo real, donde es probable que se ocuparía de este paso de "def crear" de `articles_controller

` También, en http://localhost:3000/articles/ el usuario sólo debe ser capaz de ver los artículos asociado con su user_id, no hay nadie más. ¿Qué cambios en el controlador de artículos debo hacer para hacer esto?

dentro articles_controller 's def index, cambie a @articles = Article.where(user_id:current_user.id). Tenga en cuenta que también debe agregar un before_filter :require_user para asegurarse de que current_user no sea nulo.

+0

^^ Gracias. Creo que lo descubrí. Puse <% = f.hidden_field: user_id%> en _form.html.erb y @ article.user_id = current_user.id en 'def create' de article_controller, esto está pasando el current_user.id como el user_id del artículo a la perfección. Tu segunda solución tiene sentido; Voy a dar una oportunidad ahora. – cdotfeli

+0

@cdotfeli Establecer el user_id en el formulario y no revisarlo luego significa que puede suplantar a cualquier usuario de su sitio haciendo una solicitud POST manual. –

+0

@ P.S.V.R. ¡Tu segunda solución funcionó! Muchas gracias. Iré a agregar que before_filter: require_user ahora. – cdotfeli

4

En su ArticleController # nueva acción de añadir la siguiente línea:
@article = current_user.articles.build

En cuanto a su acción index:
@articles = current_user.articles

Cuestiones relacionadas