[英]Error of mass assignement on my rspec test (Rails.32, active_admin, rspec)
我正在構建一個日常交易應用程序來學習RoR。
我的問題是關於attr_accessible
以及如何在保護屬性免遭大量分配的情況下測試模型。
我的應用程序中有3個模型:
基本上,Deals屬於Admin_users,我只希望管理員用戶能夠發布Deal。
我的問題是,如果我沒有記錯,我需要將所有屬性attr_accessible
放在attr_accessible
以便我可以創建表單並保存交易,然后為了保護屬性(尤其是admin_user_id),我添加了with_role
as: :admin
以保護它們並且僅允許管理員訪問(我以此為靈感: http : //ejholmes.github.io/2012/04/22/handling-mass-assignment-with-active-admin.html )
我的問題是放置as: :admin
之前運行的RSpec測試現在失敗了,我得到的錯誤消息是:
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 }
我的活動管理員設置:在initializers / 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模型屬性免於大規模分配。 有人知道我怎樣才能使這些測試再次通過嗎?
這里的問題是:as =>:admin標志沒有引用active_record模型,它只是您定義的任意符號。 使用它意味着您需要像這樣在create調用中以:admin傳遞
Deal.create(params[:deal], as: :admin)
因此,您的實際問題可能出在工廠,因為在制造對象時它不知道傳遞標志。 試試這個
factory :deal do
my_attr "abc"
initialize_with do
create(attributes, as: :admin)
end
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.