0

私はRailsチュートリアルに従って、自分で小さなプロジェクトを実行してから、進行を試みています。

解決策を見つけた問題に直面していますが、それを機能させるには、関連付けの検証を無効にする必要があるため、考えや意見をいただければ幸いです。

コンテキストは次のとおりです。アプリケーション(実際に実行することのビッグネーム...)には、ユーザーが自分の体重を追跡する必要があります。ユーザーがサインアップするときに、外出先で最初の小節を入力してほしい。

簡略化されたモデルは次のとおりです。

User.rb

class User < ActiveRecord::Base
  attr_accessible :email, :name, :password, :password_confirmation, :measures_attributes

  has_secure_password

  has_many :measures, dependent: :destroy
  accepts_nested_attributes_for :measures

  # here goes validations before_save, etc. taken from the Rails Tutorial
end

Measure.rb

class Measure < ActiveRecord::Base
  attr_accessible :weight
  belongs_to :user

  # This is kind where the problem is...
  # If I deactivate the validation for user_id everyhing goes fine
  validates :user_id, presence: true
  validates :weight, presence: true, numericality: { greater_than: 0 }

  default_scope order: 'measures.created_at ASC'
end

これがユーザーコントローラーです

class UsersController < ApplicationController

  # GET /users/new
  def new
    @user = User.new
    @user.measures.build
  end

  # POST /users
  def create

    @user = User.new(params[:user])

    if @user.save
      sign_in @user
      flash[:success] = "Hi #{@user.name}. Welcome !"
      redirect_to @user
    else
      render :new
    end
  end

end

これがユーザーのための部分的なフォームです:

<%= form_for(user) do |user_form| %>
  <%= render 'shared/error_messages', object: user_form.object %>

  <%= render 'users/fields', user_builder: user_form %>

  <%= user_form.fields_for :measures do |measure_fields| %>
    <%= render 'measures/fields', measure_builder: measure_fields, full: true %>
  <% end %>

  <%= user_form.submit submit_text, class: 'btn btn-large btn-primary' %>
<% end %>

また、フォームに正しく入力しても、次のエラーが発生します。

* Measures user can't be blank

それを機能させるために私が見つけた唯一の方法は、Measureモデルに存在するための:user_id検証を取り除くことです。この検証がオフの場合、ユーザーが保存され、メジャーが保存され、新しく作成されたユーザーに正しく関連付けられることを強調したいと思います。

私は何か間違ったことをしていますか?Measureモデルの:user_idプレゼンス検証は本当に便利ですか(Railsチュートリアルにあり、私にとっては完全に理にかなっています)?はいの場合、オンになっているときにメジャー検証が失敗するのはなぜですか?

よろしくお願いします。

4

2 に答える 2

1

:userの代わりに検証を試すことができuser_idます。次に、ユーザーがまだ保存されていなくても、2つがメモリに関連付けられていることがわかる場合があります。

于 2012-12-11T10:46:00.590 に答える
0

私はあなたのコードにあなたが見ているエラーを引き起こすエラーを見つけたかもしれないと思います。

新しいコントローラーでは、具体的に関連付けを作成します。

@user.measures.build

createコントローラーでは、渡されたフィールドに基づいて新しい要素を作成します。

@user = User.new(params[:user])

関連する要素が削除される場合があります。検証されない場合、またはドロップさせるために設定する必要のあるオプションがあった場合に、これがデフォルトで発生するかどうかを思い出せません。

追加する必要があると思います

@user.measure.build if @user.measures.empty?

の前のcreateコントローラーelse句でrender :new

あなたが実際にこの問題に直面しているかどうかはわかりませんが、あなたとの関連付けUserが設定されなかった理由は説明されます。

于 2012-12-10T18:14:02.447 に答える