0

ユーザーを登録しようとすると、エラーは発生しませんが、ユーザーを保存できません。持っていませんattr_accessible。何が欠けているのかわかりません。私を助けてください。

user.rb

class User < ActiveRecord::Base
  has_secure_password
  validates :email, presence: true,
                    uniqueness: true,
                    format: { with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i }
  validates :password, presence: true, length: {minimum: 6}
  validates :nickname, presence: true, uniqueness: true
end

users_controller.rb

class UsersController < ApplicationController
  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)             # Not saving @user ...
    if @user.save
      flash[:success] = "Successfully registered"
      redirect_to videos_path
    else
      flash[:error] = "Cannot create an user, check the input and try again"
      render :new
    end
  end

  private

  def user_params
    params.require(:user).permit(:email, :password, :nickname)
  end
end

ログ:

Processing by UsersController#create as HTML
Parameters: {"utf8"=>"✓",    "authenticity_token"=>"x5OqMgarqMFj17dVSuA8tVueg1dncS3YtkCfMzMpOUE=", "user"=>{"email"=>"example@example.com", "password"=>"[FILTERED]", "nickname"=>"example"}, "commit"=>"Register"}
(0.1ms)  begin transaction
User Exists (0.2ms)  SELECT 1 AS one FROM "users" WHERE "users"."email" = 'example@example.com' LIMIT 1
User Exists (0.1ms)  SELECT 1 AS one FROM "users" WHERE "users"."nickname" = 'example' LIMIT 1
(0.1ms)  rollback transaction
4

2 に答える 2

2

コメントでの短い議論については、1 つまたは 2 つのことが原因@user.saveで returnが発生しているようfalseです。

  • 検証ルールの 1 つが失敗しています
  • モデル内のコールバックが を返しfalseているため、処理が停止し、トランザクションがロールバックされています

検証をデバッグする簡単な方法がいくつかあります。いくつかのオプションを学ぶことができるように、それらを説明できると思いました.

A.ifステートメント内の呼び出しを変更して、代わりに次の bang メソッドを使用しますsave

if @user.save!

これにより、検証が失敗した場合にアプリで例外が発生し、ブラウザー内の検証エラーが画面に表示されます。この特定のシナリオで!は、アプリの最終バージョンでそれを実行したくない可能性があるため、デバッグが完了したら忘れずに を削除する必要があります。

または...

B.elseステートメント内に、次の行を追加します。

raise @user.errors.to_yaml

これにより、ブラウザ内の検証エラーが画面に表示されます。もちろん、デバッグが完了したら、忘れずにこの行を削除してください。

または...

C.elseステートメント内に次の行を追加してから、フォーム ポストを実行します。

puts @user.errors.to_yaml

これにより、コンソール内に検証エラーが表示されます。デバッグが完了したら、この行を削除することを忘れないでください。ただし、少なくとも余分な情報はSTDOUT.

少し練習して、このような単純なデバッグ シナリオでどのようなオプションがあるかを確認するために、これらのそれぞれを試してみることをお勧めします。

于 2013-10-30T02:39:20.380 に答える