Почему мой идентификатор пользователя равен нулю?
def destroy
@dignity.destroy
end
извините, это не код, это то, что я чувствую прямо сейчас. Я знаю, что есть тонна начинающих вопросов по Devise, я думаю, что я посмотрел почти каждый из них.
у меня очень простая настройка Devise в Rails 3. Я:
рельсы генерируют пользователя devise
Я также запускаю плагин rails 3 GeoKit (не уверен, что это актуально,просто знаю, что у меня есть эта другая модель), поэтому у меня есть другая модель, называемая Location, и она acts_as_mappable.
прежде чем я опубликую код, Основная проблема заключается в том, что я не могу заставить user_id автоматически увеличиваться. Я понимал, что немного магии Rails должно позаботиться об этом для меня, если я добавлю столбец с именем user_id в класс Location. (что я и сделал через миграцию.), а затем просто установите has_many и belongs_to соответственно. (см. ниже)
Я не могу понять, почему user_id всегда равен нулю. Имеет ли это какое-то отношение к тому, как Devise engine работает? Я уверен, что я сделал этот тип ассоциации в прошлом таким же образом, когда я не использовал Devise.
пользователей.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
расположение.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
вот миграция, которая добавила столбец:
class AddUseridToLocation < ActiveRecord::Migration
def self.up
add_column :locations, :user_id, :integer
end
def self.down
remove_column :locations, :user_id
end
end
и, наконец, вот схема.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
EDIT: я в порядке с ответом RTFM, пока я могу получить небольшой толчок в правильном направлении. У меня есть подозрение, которое я должен высказать. rails что-то в действии создания моего locations_controller.РБ ? Кто-нибудь, дайте мне подсказку!
1 ответов
def destroy @dignity.destroy end
ясно, что первое, что нужно сделать, это:
raise self.esteem
вы говорите, что вы не можете сделать user_id
в "автоувеличение". Я думаю, что вы имели в виду, что user_id не назначается (т. е. он всегда равен нулю). Можете ли вы показать часть кода, которая назначает местоположение пользователю? Любой из них должен работать:
@user.locations.build
@user.locations << Location.new
редактировать
чтобы немного расширить это, скажем, у вас есть запрос, который выглядит так это:
POST /users/37/locations
и представленная форма содержит input name=user[location][name] value="Paris"
. Типичное действие Rails controller create может выглядеть так:
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
"магия" в основном рельсы, выводящие из has_many
оператор, который должен установить значение столбца внешнего ключа ('user_id') в связанной строке в таблице местоположений. Когда вы звоните @user.save
он добавляет новую строку locations
и телеаппаратуры user_id
стоимостью @user.id
.