【问题标题】:ActiveRecord::UnknownAttributeError on User.advertisements.createUser.advertisements.create 上的 ActiveRecord::UnknownAttributeError
【发布时间】:2016-02-27 00:12:20
【问题描述】:

我有一个使用用户和会话的 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

用户.rb

class User < ActiveRecord::Base
  has_many :advertisements, dependent: :destroy

  # Rails's built-in password security
  has_secure_password
end

广告.rb

class Advertisement < ActiveRecord::Base
  belongs_to :user
end

创建广告时,我得到一个未知属性 user_id @advertisement = current_user.advertisements.create(advertisement_params)

这一行。它应该调用位于 application_controller.rb 上的 current_user

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 数据库上的空间)。

【问题讨论】:

  • 您可以尝试 1. 运行并重新启动您的应用 2. 检查广告表是否有user_idtitlebody 列。
  • 您的数据库中的advertisements 表中有user_id 列吗?
  • 我的advertisements 表中有belongs_to :users
  • @archana 我不知道。如果我添加它,它会是什么类型?我认为它不是一个字符串。
  • ID 列是整数类型

标签: ruby-on-rails ruby activerecord has-many


【解决方案1】:

听起来您的advertisements 表有一个名为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

下次使用外键创建表时,请执行以下操作:

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 的层次结构是否重要?
  • Rails 希望您在某些地方使用单数,而在其他地方使用复数。大多数情况下它是有道理的,但需要一点时间来适应。由于广告有一个用户,它是user_id,而不是users_id。我会用你如何改变它来更新答案。
  • 我删除了users_id 列并离开了user_id(抱歉,现在才看到你的编辑。我刚刚删除了users_id 一个,它是nil),它有效。但是,关于您的回答,我如何通过用户拥有 adbertisement 那么?
  • 您的原始方法很好:current_user.advertisements.build(advertisement_params)。广告的 user_id 将自动设置,因为您将其构建为该关联的一部分。
  • 我正在使用 .build 方法为#<0x007fbe82372588>
【解决方案2】:

这在您的广告创建操作中不起作用:

@advertisement = current_user.advertisements.create(advertisement_params)

如果广告属于用户...user_id 应该在允许的广告参数中。然后您应该将 current_user.id 与其他参数一起传递给 Advertisement.new(一种方法是通过表单中的 hidden_​​field )。

您不应该在您的创建操作中调用 .create。

if @advertisement.save

将保存对象并创建它。希望这会有所帮助。

【讨论】:

  • 所以我将 :user_id 添加到允许的参数中,然后在advertisements#create 中调用@advertisement = Advertisement.new(advertisement_params)?这会将广告分配给数据库中的当前用户吗?
  • 现在我有一个专栏,users_id: nil,它总是为零。这是哪里来的?
  • 您绝对应该在参数哈希中发送user_id,除非您希望人们为其他用户创建广告!但不是create,而是说current_user.advertisements.build(....)。然后它不会保存到下一行。
  • 您可以通过表单将 user_id 作为 hidden_​​field 传递。
  • @karma_police 我也是!
猜你喜欢
  • 2011-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多