0

我正在构建一个日常交易应用程序来学习 RoR。

我的问题是关于attr_accessible以及如何测试一个属性受到保护以防止大规模分配的模型。

我的应用中有 3 个模型:

  • 用户(通过设计)
  • 交易
  • Admin_users(通过活动管理 gem)

基本上交易属于_to Admin_users,我只希望管理员用户能够发布交易。

我遇到的问题是,如果我没记错的话,我需要放置所有属性attr_accessible,以便我可以创建一个表单并保存一个交易,然后,为了保护属性(尤其是 admin_user_id),我添加了with_role as: :admin以保护它们并使其只能访问管理员(我以此为灵感:http ://ejholmes.github.io/2012/04/22/handling-mass-assignment-with-active-admin.html )

我的问题是在 put 之前工作的 RSpec 测试as: :admin现在失败了,我得到的错误消息是:

   ActiveModel::MassAssignmentSecurity::Error:
   Can't mass-assign protected attributes: url_path, country, title, description, twitter_msg, image_url, prelaunch_date, deal_launch_date, deal_end_date, featured, admin_user_id

我认为 RSpec 不会让我成为管理员,因此我有权批量分配这些属性。

我该如何解决这个问题?

这是我的文件供参考:

deal_spec.rb

class Deal < ActiveRecord::Base

belongs_to :admin_user, :foreign_key => 'admin_user_id'

attr_accessible :url_path,
              :country,
              :title,
              :description,
              :twitter_msg,
              :image_url,
              :prelaunch_date,
              :deal_launch_date,
              :deal_end_date,
              :featured,
              :admin_user_id,
              :as => :admin_user

validates :title,
          presence: true,
          length: { maximum: 200 }

我的活动管理员设置:在初始化程序/active_admin.rb

ActiveAdmin.setup do |config|

config.site_title = "My App"


config.logout_link_path = :destroy_admin_user_session_path


config.batch_actions = true

# got it on http://ejholmes.github.io/2012/04/22/handling-mass-assignment-with-active-admin.html
module ActiveAdmin
 class BaseController
   with_role :admin_user
 end
end

end
  • 我的测试文件:

admin_users 的工厂:

FactoryGirl.define do
  factory :admin_user do
  sequence(:email) { |n| "person_#{n}@example.com"}   
  password "admin_pass"
  password_confirmation "admin_pass"
end
end

而实际上失败的测试:这是标题长度测试的一个例子:

require 'spec_helper'
require 'date'

describe Deal do

let(:admin_user) { FactoryGirl.create(:admin_user) }

before(:each) do
@attr = {
  url_path:    "lorem ipsum",
  country:     "France",
  title:       "lorem ipsum",
  description: "lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum",
  twitter_msg: "http://www.example.com",
  image_url:   "http://www.example2.com",
  prelaunch_date:     2.days.from_now.change(hour: 10),
  deal_launch_date:   3.days.from_now.change(hour: 10),
  deal_end_date:      15.days.from_now.change(hour: 10),
  featured:           true,
  admin_user_id: 1
}

describe "tests TITLES" do
it { should validate_presence_of(:title) }

it "should reject title that is too long" do
  long = "a" * 211
  hash = @attr.merge(:title => long)
  Deal.new(hash).should have(1).error_on(:title)
end


end

我觉得我没有告诉我的 deal_rspec.rb 测试文件 :admin_user 真的是管理员!我不知道该怎么做,即使我很好地保护了我的 Deal 模型属性以防止批量分配。有谁知道我怎样才能让这些测试再次通过?

4

1 回答 1

1

这里的问题是 :as => :admin 标志不是指 active_record 模型,它只是您定义的任意符号。使用它意味着您需要像这样在创建调用中传递: :admin

Deal.create(params[:deal], as: :admin)

所以你的实际问题可能与你的工厂有关,因为它不知道在制造你的对象时传递标志。尝试这样的事情

factory :deal do
  my_attr "abc"
  initialize_with do
    create(attributes, as: :admin)
  end
end
于 2013-09-21T03:54:19.223 回答