0

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 モデルの属性を大量割り当てから保護している場合でも。これらのテストに再び合格する方法を知っている人はいますか?

4

1 に答える 1