Ruby on rails ActiveRecord::User.advisions.create上的UnknownAttributeError

Ruby 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

我有一个rails应用程序,它支持用户和会话。用户有许多广告,在将用户模型更改为有许多广告时,我遇到了未知属性错误

广告u 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
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方法为#`获取一个
未定义的方法。