User.advertisements.create上的ActiveRecord :: UnknownAttributeError

时间:2016-02-27 00:12:21

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

我有一个用户用户和会话的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     @advertisement = 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_tousers_id: nil来自哪里?我只关心因为,当我删除用户时,我希望删除所有advertisements(并且不要在ym数据库上浪费空间)。

2 个答案:

答案 0 :(得分: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/

答案 1 :(得分:0)

这不适用于您的广告制作操作:

@advertisement = current_user.advertisements.create(advertisement_params)

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

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

if @advertisement.save

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