RoR を学習するためのデイリー ディール アプリを作成しています。
私の質問はattr_accessible
、属性が大量割り当てから保護されているモデルをテストする方法についてです。
アプリに 3 つのモデルがあります。
- ユーザー(デバイス経由)
- お買い得
- Admin_users (アクティブな admin gem を使用)
基本的に取引は 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 )
私の問題は、置く前に機能していた 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 }
私のアクティブな管理者のセットアップ: 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
そして、実際に失敗している TEST: タイトルの長さテストの例です:
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 モデルの属性を大量割り当てから保護している場合でも。これらのテストに再び合格する方法を知っている人はいますか?