1

私はこの問題で数日立ち往生しています..助けてください、事前に感謝します.

これは mongoid の Rails プロジェクトです。プロジェクトには 2 つのモデルがあり、1 つは User で、もう 1 つは CustomSearchEngine です。

class User
  include Mongoid::Document
  # Include default devise modules. Others available are:
  ......
  # keep the CSEs
  has_and_belongs_to_many :keeped_custom_search_engines, class_name: 'CustomSearchEngine', inverse_of: :consumers

  # create or fork the CSEs
  has_many :custom_search_engines, inverse_of: :author, dependent: :destroy

  # Index
  index({username: 1}, {unique: true, name: 'user_username'})
  index({email: 1}, {unique: true, name: 'user_email'})

  # Massive assignment for User.new
  attr_accessible :email, :username, :agreement, :password, :password_confirmation
  attr_accessor :agreement, :password_confirmation
  validates :password_confirmation, presence: true
  validates :agreement, presence: true
end

class CustomSearchEngine
  include Mongoid::Document
  include Mongoid::Timestamps
  paginates_per 20
 ...
  belongs_to :author, class_name: 'User', inverse_of: :custom_search_engines
  has_and_belongs_to_many :consumers, class_name: 'User', inverse_of: :keeped_custom_search_engines
  belongs_to :node

  # Index
  index({author_id: 1}, {name: 'cse_author_id'})
  index({node_id: 1}, {name: 'cse_node_id'})

  # validations
  validates :status, presence: true, inclusion: {in: ['draft', 'publish']}
  validates :author_id, presence: true
  validates :node_id, presence: true

  scope :recent, ->(status) { where(status: status).desc(:created_at) }
  ...
end

私の CustomSearchEngine コントローラーで:

current_user.keeped_custom_search_engines.push(@custom_search_engine)

次に、mongodb に移動すると、更新されたユーザー ドキュメントのみが表示されます。

keeped_custom_search_engine_ids: ["50a208092061c770190000df"]

ただし、カスタム検索エンジンのドキュメントは変更されていません:

consumer_ids: [] 

そして、私はエラーが発生します: @messages={:consumers=>["is invalid"]}

私が逃した何か?

4

1 に答える 1

0

この問題は、コンシューマー インスタンスがデータベースに保存される前にコンシューマーをプッシュすることだと思います。

次のようなコードを試してください。

  def create
@team = Team.new(params[:team])
@team.own = current_user
respond_to do |format|
  if @team.save
    current_user.push_join_teams(@team.id)
    format.html { redirect_to @team, notice: 'Team was successfully created.' }
    format.json { render json: @team, status: :created, location: @team }
  else
    format.html { render action: "new" }
    format.json { render json: @team.errors, status: :unprocessable_entity }
  end
end
end

#user.rb
def push_join_teams(tid)
 return false if self.join_team_ids.include?(tid)
 self.push(:join_team_ids,tid)
end
于 2013-09-16T02:14:37.907 に答える