Ruby on rails ActiveRecord::User.advisions.create上的UnknownAttributeError
我有一个rails应用程序,它支持用户和会话。用户有许多广告,在将用户模型更改为有许多广告时,我遇到了未知属性错误 广告u controller.rbRuby on rails ActiveRecord::User.advisions.create上的UnknownAttributeError,ruby-on-rails,ruby,activerecord,has-many,Ruby On Rails,Ruby,Activerecord,Has Many,我有一个rails应用程序,它支持用户和会话。用户有许多广告,在将用户模型更改为有许多广告时,我遇到了未知属性错误 广告u controller.rb class AdvertisementsController < ApplicationController before_action :require_user, only: [:new, :create] def index @advertisements = Advertisement.all end de
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
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
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
编辑:现在,如果我创建并广告
,然后列出它,我会得到
[#<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\u id:nil
。我认为,当它填充users\u id
时,它没有做属于的事情。users\u id:nil
来自哪里?我只是担心,当我删除一个用户时,我希望他们所有的广告也被删除(并且不要在ym数据库上浪费空间)。这在您的广告创建操作中不起作用:
@advertisement = current_user.advertisements.create(advertisement_params)
如果广告属于某个用户…用户id应位于允许的广告参数中。然后,您应将当前的用户id与其他参数一起传递给advision.new(一种方法是通过表单中的隐藏字段)
您不应该调用。从创建操作内部创建
说
if @advertisement.save
将保存对象并将其创建。希望这有帮助。听起来您的广告
表有一个名为users\u id
的列,它应该是user\u id
。我将编写一个迁移来更改该列的名称
您可以通过首先生成迁移来解决此问题:
rails g migration rename_advertisements_users_id
rake db:migrate && RAILS_ENV=test rake db:migrate
然后为迁移提供以下内容:
def change
rename_column :advertisements, :users_id, :user_id
end
然后运行迁移:
rails g migration rename_advertisements_users_id
rake db:migrate && RAILS_ENV=test rake db:migrate
下次使用外键创建表时,请执行以下操作:
create_table :pages do |t|
t.references :book # not books
t.text :text
t.timestamps
end
另外,我不会修复旧的迁移。只需编写新的迁移。原因如下:你可以尝试1.运行并重新启动你的应用程序2.检查广告表是否有用户id
、标题
和正文
列。你在数据库的广告表中有用户id
列吗?我有e属于:我的广告中的用户
table@archana我不知道。如果我添加它,它会是什么类型?我假设它不是字符串。ID列的类型是整数,所以我会将:user\u ID添加到允许的参数中,然后调用@advision=advision.new(advision\u参数)
在广告中#创建
?这会将广告分配给数据库中的当前用户吗?现在我有一个列,users\u id:nil
,它总是为nil。这是从哪里来的?你绝对不应该在参数散列中发送user\u id
,除非你希望人们为其他人创建广告r用户!但不要使用create
,而是使用current\u user.advisions.build(…)
。然后它将一直保存到下一行。您可以通过表单将user\u id作为隐藏字段传递。@karma\u我也是!确实如此。这列什么时候创建的?这对rails的层次结构模式很重要吗?rails希望您在某些地方使用单数,在其他地方使用复数。这基本上是有意义的,但需要一点了解ng以前是。因为广告只有一个用户,所以它是user\u id
,而不是users\u id
。我将更新答案,说明您可以如何更改它。我删除了users\u id
列,并留下了user\u id
(抱歉,现在只看到了您的编辑。我刚刚删除了users\u id one,它是零),有效。但是,关于您的答案,我如何通过用户拥有的adbertiement
呢?您最初的方法很好:当前用户.advisions.build(advision\u参数)
。将自动设置广告的用户id
,因为您将其作为该关联的一部分构建。我将使用.build方法为#`获取一个未定义的方法。