0

私にはユーザーがいます。ユーザーには多くのクライアントと連絡先があります。クライアントにも多くの連絡先があります (連絡先はユーザーとクライアントの両方に属します)。

クライアント ビューで、新しいクライアントを作成し、同じフォームでユーザーがそのクライアントの最初の連絡先を作成できるようにしたいと考えています。最初は、ネストされた属性を使用するとうまくいくと思っていましたが、いくつかの問題が発生しています。client_controller#create で @client を保存しようとすると、連絡先の user_id を空白にすることはできず、client_id を空白にすることもできないため、保存できません。これが私がこれまでに持っているものです:

クライアント コントローラー インデックス (新しいクライアント フォームがある場所):

  def index
    @clients = current_user.clients
    @client = Client.new
    @contact = @client.contacts.build

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @clients }
    end
  end

および create メソッド:

  def create
    @client = current_user.clients.new(params[:client])

    respond_to do |format|
      if @client.save

そしてフォーム:

  = form_for(@client) do |f|
          = f.fields_for(:contacts) do |contact|

しかし、保存するときはclient_idとuser_idが必要です...しかし、ネストされた属性を使用してそれらを実際に設定することはできません。どうすればこれを達成できますか? これを行うより良い方法はありますか?ここに私のパラメータがあります:

{"name"=>"asdf", "contacts_attributes"=>{"0"=>{"name"=>"asdf", "email"=>"asdf@gmail.com"}}}

欠落している値を直接contacts_attributesに追加しようとしましたが、@clientがまだ保存されていないため、client.idをcontactに割り当てることができません:

params[:client][:contacts_attributes]["0"].merge!(:user_id => current_user.id)
params[:client][:contacts_attributes]["0"].merge!(:client_id => @client.id)

user_id が設定されていても...ユーザーが見つからないと言われます。

4

3 に答える 3

0

次の検証は、検証が実行された時点で親 ID が子オブジェクトに割り当てられていないため、この問題を引き起こしている可能性があります。これを回避するには、これらの検証を削除するか、更新時にのみ実行するように設定します。このようにして、 create メソッドのこれらの検証を失いますが、機能します。

# client.rb
validates :user, presence: true

# contact.rb
validates :client, presence: true
于 2015-06-09T15:02:12.123 に答える