ActiveRecord::UnknownAttributeError 在 User.advertisements.create
ActiveRecord::UnknownAttributeError on User.advertisements.create
我有一个 rails 用户用户和会话的应用程序。用户有很多广告,并且在将用户模型更改为有很多广告时,我 运行 变成了未知属性错误。
Advertisements_controller.rb
class AdvertisementsController < ApplicationController
before_action :require_user, only: [:new, :create]
def index
@advertisements = Advertisement.all
end
def new
@advertisement = Advertisement.new
end
def create
@advertisement = current_user.advertisements.create(advertisement_params)
if @advertisement.save
redirect_to '/advertisements/index'
else
redirect_to '/advertisements/new'
end
end
private
def advertisement_params
params.require(:advertisement).permit(:title, :body)
end
end
user_controller.rb
class UsersController < ApplicationController
def new
@user = User.new
end
def create
@user = User.new(user_params)
if @user.save then
session[:user_id] = @user.id
redirect_to '/'
else
redirect_to '/signup'
end
end
private
def user_params
params.require(:user).permit(:first_name, :last_name, :email, :password)
end
end
user.rb
class User < ActiveRecord::Base
has_many :advertisements, dependent: :destroy
# Rails's built-in password security
has_secure_password
end
advertisement.rb
class Advertisement < ActiveRecord::Base
belongs_to :user
end
创建广告时,我得到一个未知属性 user_id
@广告 = current_user.advertisements.create(advertisement_params)
这一行。它应该调用 current_user,它位于 application_controller.rb
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
编辑:现在如果我创建并 advertisement
然后列出它,我得到
[#<Advertisement id: 1, created_at: "2016-02-27 00:50:55", updated_at: "2016-02-27 00:50:55", title: "my advert", body: "it belongs to me!", users_id: nil, user_id: 1>
注意 users_id: nil
。我认为,当它填充 user_id
时,它没有正确地做 belongs_to
事情。 users_id: nil
来自哪里?我只是担心,因为当我删除一个用户时,我希望他们所有的 advertisements
也被删除(而不是在 ym 数据库上浪费 space)。
这在您的广告创建操作中不起作用:
@advertisement = current_user.advertisements.create(advertisement_params)
如果广告属于用户...user_id 应该在允许的广告参数中。然后你应该将 current_user.id 与其他参数一起传递给 Advertisement.new(一种方法是通过表单中的 hidden_field)。
您不应该在创建操作中调用 .create。
说
if @advertisement.save
将保存对象并将创建它。希望这有帮助。
听起来您的 advertisements
table 有一个名为 users_id
的列,它应该是 user_id
。我会写一个迁移来更改该列的名称。
您可以通过首先生成迁移来解决此问题:
rails g migration rename_advertisements_users_id
然后给迁移这些内容:
def change
rename_column :advertisements, :users_id, :user_id
end
然后运行迁移:
rake db:migrate && RAILS_ENV=test rake db:migrate
下次使用外键创建 table 时,请执行以下操作:
create_table :pages do |t|
t.references :book # not books
t.text :text
t.timestamps
end
此外,我不会修复旧迁移。只写新的。原因如下:http://illuminatedcomputing.com/posts/2013/03/rules-for-rails-migrations/
我有一个 rails 用户用户和会话的应用程序。用户有很多广告,并且在将用户模型更改为有很多广告时,我 运行 变成了未知属性错误。
Advertisements_controller.rb
class AdvertisementsController < ApplicationController
before_action :require_user, only: [:new, :create]
def index
@advertisements = Advertisement.all
end
def new
@advertisement = Advertisement.new
end
def create
@advertisement = current_user.advertisements.create(advertisement_params)
if @advertisement.save
redirect_to '/advertisements/index'
else
redirect_to '/advertisements/new'
end
end
private
def advertisement_params
params.require(:advertisement).permit(:title, :body)
end
end
user_controller.rb
class UsersController < ApplicationController
def new
@user = User.new
end
def create
@user = User.new(user_params)
if @user.save then
session[:user_id] = @user.id
redirect_to '/'
else
redirect_to '/signup'
end
end
private
def user_params
params.require(:user).permit(:first_name, :last_name, :email, :password)
end
end
user.rb
class User < ActiveRecord::Base
has_many :advertisements, dependent: :destroy
# Rails's built-in password security
has_secure_password
end
advertisement.rb
class Advertisement < ActiveRecord::Base
belongs_to :user
end
创建广告时,我得到一个未知属性 user_id @广告 = current_user.advertisements.create(advertisement_params)
这一行。它应该调用 current_user,它位于 application_controller.rb
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
编辑:现在如果我创建并 advertisement
然后列出它,我得到
[#<Advertisement id: 1, created_at: "2016-02-27 00:50:55", updated_at: "2016-02-27 00:50:55", title: "my advert", body: "it belongs to me!", users_id: nil, user_id: 1>
注意 users_id: nil
。我认为,当它填充 user_id
时,它没有正确地做 belongs_to
事情。 users_id: nil
来自哪里?我只是担心,因为当我删除一个用户时,我希望他们所有的 advertisements
也被删除(而不是在 ym 数据库上浪费 space)。
这在您的广告创建操作中不起作用:
@advertisement = current_user.advertisements.create(advertisement_params)
如果广告属于用户...user_id 应该在允许的广告参数中。然后你应该将 current_user.id 与其他参数一起传递给 Advertisement.new(一种方法是通过表单中的 hidden_field)。
您不应该在创建操作中调用 .create。
说
if @advertisement.save
将保存对象并将创建它。希望这有帮助。
听起来您的 advertisements
table 有一个名为 users_id
的列,它应该是 user_id
。我会写一个迁移来更改该列的名称。
您可以通过首先生成迁移来解决此问题:
rails g migration rename_advertisements_users_id
然后给迁移这些内容:
def change
rename_column :advertisements, :users_id, :user_id
end
然后运行迁移:
rake db:migrate && RAILS_ENV=test rake db:migrate
下次使用外键创建 table 时,请执行以下操作:
create_table :pages do |t|
t.references :book # not books
t.text :text
t.timestamps
end
此外,我不会修复旧迁移。只写新的。原因如下:http://illuminatedcomputing.com/posts/2013/03/rules-for-rails-migrations/