2011-02-16 19 views
6
def destroy 
    @dignity.destroy 
end 

Lo siento, eso no es código, así es como me siento ahora. Sé que hay un montón de preguntas para principiantes sobre Devise, creo que miré casi todas.¿Por qué mi user_id es nulo?

Tengo una configuración muy simple Diseñar en Rails 3. hice:

rieles generan idear usuario

También estoy ejecutando los rieles plugin de 3 Geokit, (no estoy seguro si eso es relevante, solo sé que tengo este otro modelo) entonces tengo otro modelo llamado Ubicación, y actúa_como_materble.

Antes de publicar el código, el problema básico es que parece que no puedo hacer que user_id aumente automáticamente. Tenía entendido que un poco de magia de Rails debería ocuparse de esto por mí, si agrego una columna llamada user_id a la clase Location. (lo cual hice a través de una migración) y luego simplemente configuró has_many y belongs_to en consecuencia. (vea abajo)

No puedo entender por qué user_id es siempre nulo. ¿Tiene algo que ver con la forma en que funciona el motor Devise? Estoy bastante seguro de haber hecho que este tipo de asociación funcione en el pasado de la misma manera cuando no estaba usando Devise.

user.rb:

class User < ActiveRecord::Base 

    has_many :locations 

    # Include default devise modules. Others available are: 
    # :token_authenticatable, :confirmable, :lockable and :timeoutable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    # Setup accessible (or protected) attributes for your model 
    attr_accessible :email, :password, :password_confirmation, :remember_me 
end 

location.rb:

class Location < ActiveRecord::Base 
    belongs_to :user 


    attr_accessible :street_adress, :city, :state, :zip, :item, :user_id 
    acts_as_mappable :auto_geocode => true 

    def address 
    return "#{self.street_adress}, #{self.city}, #{self.state}, #{self.zip}, #{self.item}" 
    end 

end 

aquí es la migración que se añadió la columna:

class AddUseridToLocation < ActiveRecord::Migration 
    def self.up 
    add_column :locations, :user_id, :integer 
    end 

    def self.down 
    remove_column :locations, :user_id 
    end 
end 

Y, por último, aquí está el esquema. rb:

ActiveRecord::Schema.define(:version => 20110213035432) do 

    create_table "locations", :force => true do |t| 
    t.string "street_adress" 
    t.string "city" 
    t.string "state" 
    t.string "zip" 
    t.float "lat" 
    t.float "lng" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    t.string "item" 
    t.integer "user_id" 
    end 

    create_table "users", :force => true do |t| 
    t.string "email",        :default => "", :null => false 
    t.string "encrypted_password", :limit => 128, :default => "", :null => false 
    t.string "password_salt",      :default => "", :null => false 
    t.string "reset_password_token" 
    t.string "remember_token" 
    t.datetime "remember_created_at" 
    t.integer "sign_in_count",      :default => 0 
    t.datetime "current_sign_in_at" 
    t.datetime "last_sign_in_at" 
    t.string "current_sign_in_ip" 
    t.string "last_sign_in_ip" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

    add_index "users", ["email"], :name => "index_users_on_email", :unique => true 
    add_index "users", ["reset_password_token"], :name => "index_users_on_reset_password_token", :unique => true 

end 

EDITAR: Estoy de acuerdo con una respuesta RTFM, siempre y cuando pueda obtener un pequeño impulso en la dirección correcta. Tengo la sospecha de que necesito decirle a los rieles algo en la acción crear de mis locations_controller.rb? ¡Alguien me da una pequeña pista aquí!

+0

debería simplemente agregar que en mi location.rb, agregué el ': user_id' en' attr_accessible' solo tratando de hacer que funcione, es por eso que está ahí, si te lo estás preguntando ... – Kevin

+0

Publica el código donde creas las ubicaciones –

+0

¿Por qué user_id en el incremento de la tabla de ubicaciones? No lo hará. La id en la tabla de usuario se incrementará. – Zabba

Respuesta

10
def destroy 
    @dignity.destroy 
end 

Es evidente que lo primero que hay que hacer es:

raise self.esteem 

Usted dice que no puede obtener user_id al "incremento automático". Creo que lo que quiso decir es que user_id no se está asignando (es decir, siempre es nulo). ¿Puedes mostrar la parte del código que asigna una ubicación a un usuario? Cualquiera de estos debe trabajar:

@user.locations.build 
@user.locations << Location.new 

EDITAR

Para ampliar esto un poco, digamos que tiene una petición que tiene este aspecto:

POST /users/37/locations 

Y el formulario enviado contiene input name=user[location][name] value="Paris".Un controlador de rieles típica crear la acción podría tener este aspecto:

def create 
    @user = User.find(params[:user_id]) 
    @user.locations.build(params[:user][:location]) 
    if @user.save 
    flash[:notice] = "Location created successfully" 
    redirect_to user_locations_path(@user) 
    else 
    render :new 
    end 
end 

La 'magia' es básicamente Rails deducir de la declaración has_many que necesita para establecer el valor de la columna de clave externa ('user_id') en el relacionado fila en la tabla de ubicaciones. Cuando llame al @user.save, agrega una nueva fila en locations y establece user_id en el valor de @user.id.

+2

nice first suggestion :) – sscirrus

+0

¡ja! bien jugado, señor. No tengo nada que le asigne una ubicación a un usuario. : | ¿Debería estar lo que ha publicado en la acción de crear para la ubicación? Por cierto, soy muy nuevo en todo esto, no solo en los rieles, sino en la codificación en general. Voy a jugar con esto ahora, y ver qué pasa. Me estoy dando cuenta de que sé mucho menos de lo que pensaba. – Kevin

+0

Saber que hay cosas que no sabes es un buen comienzo. Creo que Yoda dijo eso. O tal vez Donald Rumsfeld. – zetetic

Cuestiones relacionadas