2

以下はモデルです:

class User < ActiveRecord::Base
   has_many :companies_users
   has_many :companies, :through => :companies_users
end

class Company < ActiveRecord::Base
   has_many :companies_users
   has_many :users, :through => :companies_users

   accepts_nested_attributes_for :users
   attr_accessible :name, :address_1, :address_2, :area, :city, :state, :zipcode, :country, :users_attributes

   after_create :create_subscriptions

   def create_subscriptions
     subscription=Subscription.create(:company_id => self.id, :subscription_dt => Date.today, :is_active => 'Y', :user_id => self.users.first.id)
     subscription.save
   end      

end

class CompaniesUser < ActiveRecord::Base
    belongs_to :user
    belongs_to :company 
end

以下は、spec/factories/factory.rb です。

FactoryGirl.define do

  factory :company do |f|
    f.name "TestCompany"
    f.domain_url "test_url"
    users {|t| [t.association(:user)] } 
  end

  factory :user do |f| 
    f.first_name "John"
    f.last_name "Doe"
    f.password  "password"
    f.email "JohnDoe@test.com"
    f.mobile_no "25589875"
    f.fax_no  "25548789"
    f.office_no  "25578455"     
  end

  factory :companiesuser do |f|
    association :user
    association :company
  end

end

以下は私のspec/model/company_spec.rbです

 context "Check methods" do

    it "check after create methods" do     
      company = FactoryGirl.create(:company)
    end

  end

上記の company_spec を実行すると、会社モデルに存在するメソッド サブスクリプションが原因で問題が発生し、作成コールバック create_subscriptions. の後に呼び出します。

$ rspec spec/models/company_spec.rb 
F

Failures:

  1) Company Model: Check methods check after create methods
     Failure/Error: company = FactoryGirl.create(:company)
     RuntimeError:
       Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id
     # ./app/models/company.rb:47:in `create_subscriptions'
     # ./spec/models/company_spec.rb:45:in `block (3 levels) in <top (required)>'

私が何をする必要があるか、またはその関連付けに関連する問題を誰かに教えてもらえますか? 最初に会社に値を入力しますが、ユーザーテーブルに値を入力できないため、サブスクリプションメソッドで必要なユーザーIDを取得できないため、問題が発生します。

4

2 に答える 2

1

「spec/model/company_spec.rb」のコードを次のように変更して、上記の問題を解決しました。

context "Check methods" do    
    it "check after create methods" do
      company = create(:company,"name"=>"mycom","domain_url"=>"test","users_attributes"=>{"0"=>{"email"=>"test@testing.com","password"=>"password","password_confirmation"=>"password"}})
    end
  end

結合テーブルにもデータを作成し、正常に機能しました。明らかに、ファクトリ ジョインによって行われるわけではありません。ここでユーザー属性を直接渡します。だから削除された行

users {|t| [t.association(:user)] }

会社の工場から。

于 2013-10-16T06:58:37.697 に答える
0

ネストされた has_many :through を実行しましたが、基本的に属性を :companies_users モデルに渡し、次に :users モデルに渡す必要があります


私のコード (Rails 4.0)

#views/admin/posts/new
<%= form_for [:admin, resource], :html => { :multipart => true }  do |f| %>
    <table class="resource_table">
        <thead>
            <th colspan="2"><%= params[:action].capitalize %> <%= resource_class %></th>
        </thead>
        <tbody class="form">
            <% attributes.each do |attr| %>
                <tr class="<%= cycle('odd', '')%>">
                    <td><%= resource_class.human_attribute_name(attr) %></td>
                    <td>
                        <% if attr == "body" %>
                            <%= f.text_area attr, :rows => 60, :cols => 80, :class => "redactor" %>
                        <% else %>
                            <%= f.text_field attr, :value => resource.public_send(attr).to_s %>
                        <% end %>
                    </td>
                </tr>
            <% end %>
            <%= f.fields_for :images_posts do |images_posts| %>
                <%= images_posts.fields_for :image do |images| %>
                    <tr>
                        <td>Image</td>
                        <td><%= images.file_field :image %></td>
                    </tr>
                <% end %>
                <tr>
                    <td>Caption</td>
                    <td><%= images_posts.text_field :caption %></td>
                </tr>
            <% end %>
            <tr class="dull">
                <td colspan="2"><%= f.submit "Go" %></td>
            </tr>
        </tbody>
    </table>
<% end %>

モデル

#models/image_post.rb (the join model)   
class ImagePost < ActiveRecord::Base
        
        #Associations
        belongs_to :post, :class_name => 'Post'
        belongs_to :image, :class_name => 'Image'
        
        #Validations
        validates_uniqueness_of  :post_id, :scope => :image_id
        
        #Nested Association (Can upload & add images from form)
        accepts_nested_attributes_for :image, :allow_destroy => true
        
end


#models/image.rb
class Image < ActiveRecord::Base

    #Associations
    has_many :products, :class_name => 'Product', :through => :images_products, dependent: :destroy
    has_many :images_products, :class_name => 'ImageProduct'

    has_many :posts, :class_name => 'Post', :through => :images_posts, dependent: :destroy
    has_many :images_posts, :class_name => 'ImagePost'

    has_many :brands, :class_name => 'Brand', :through => :brands_images, dependent: :destroy
    has_many :brands_images, :class_name => 'BrandImages'

    #Image Upload 
    Paperclip.options[:command_path] = 'C:\RailsInstaller\ImageMagick'
    has_attached_file :image,
        :styles => { :medium => "x300", :thumb => "x100" },
        :default_url => "",
        :storage => :s3,
        :bucket => ''
        :s3_credentials => S3_CREDENTIALS

    #Validations
    validates_presence_of :image, :message => "No Image Present!"

end

#models/post.rb
class Post < ActiveRecord::Base

    #Images
    has_many :images, -> { uniq }, :class_name => 'Image', :through => :images_posts, dependent: :destroy
    has_many :images_posts, :class_name => 'ImagePost'

    #Nested Association (Can upload & add images from form)
    accepts_nested_attributes_for :images_posts, :allow_destroy => true

end

これは私にとって大きな助けになりました: has_many を使用した Rails のネストされたフォーム :through, how to edit attributes of join model?


問題の診断

私は自分のコードを投稿して、あなたができることの実際の例を示しました(私のものにはまだ改良が必要ですが、動作します)

コードを見ると、次のように「accepts_nested_attributes_for」を companies_users.rb モデルに追加する必要があります。

accepts_nested_attributes_for :user

会社モデルで、accepts_nested_attributes_for を次のように変更します。

accepts_nested_attributes_for :companies_users
于 2013-10-11T06:41:40.333 に答える