5

Ruby on Rails は初めてで、このサイトも初めてです。モデルに設定した検証からのエラーをコントローラーで取得しようとしているので、このエラーが発生したかどうかに応じてフラッシュメッセージを変更できます。

私はこの検証を持っています:

class User < ActiveRecord::Base
attr_accessible :login, :password
validates_presence_of :login , :message => 'Login can't be empty'
validates_presence_of :password ,:message => 'Password can't be empty'

コントローラーに次のコードがあります。

def create
login = params[:username].downcase
password = params[:password]
tuser=User.new(login: login, password: password).save
if(tuser.errors.any?)
  flash[:title]='¡Error!'
  flash[:notice]='Please verify your data'
else
  flash[:title]='¡Success!'
  flash[:notice]='Your account was created'
end

そして、html でこのフラッシュ オブジェクトを使用して、ブートストラップ モーダルをレンダリングしています。

<% if flash[:notice] %>
<div class="modal hide fade" id="modal">
  <div class="modal-header">
    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;    </button>
    <h3><%= flash[:title]  %></h3>
  </div>
  <div class="modal-body">
    <%= flash[:notice]  %>
  </div>
  <div class="modal-footer">
    <button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
  </div>
</div>

問題はコントローラーで発生し、次のエラーが発生します。

NoMethodError in UserController#create

undefined method `errors' for false:FalseClass

flash [notice] エラー メッセージをバリデーションによってスローされたものに変更したいのですが、できません。いくつかのチュートリアルに従いましたが、.html ファイルで @tuser グローバル変数を使用して検証エラー メッセージを取得しており、コントローラーでそれらを処理する必要があります。誰でも私を助けることができますか?

ありがとう

4

2 に答える 2

4

save を呼び出すと、検証Trueが行われ、save が成功したか、saveを呼び出したときにFalsetuser を設定していたか、成功しなかったかがTrue返さFalseれます。Save が false の場合、エラーが生成されてアクセスできるため、チェックする必要はありません。これを試して:

def create
  login = params[:username].downcase
  password = params[:password]
  @tuser=User.new(login: login, password: password)
  #you could also use @tuser = User.new(params[:user]) but you will have to rename :username to :login
  if tuser.save
    flash[:title]='¡Success!'
    flash[:notice]='Your account was created'
    #redirect_to user_path(@tuser)
  else
    flash[:title]='¡Error!'
    flash[:notice]='Please verify your data'
    #render 'new'
  end
end

どこからこれを呼び出しているのかわからないため、上記のコメントアウトのように、おそらくコードにリダイレクトまたはレンダリングを追加する必要があります。

編集 また、モデルにダウンケースを追加すると、Rails とよりインラインになります。

before_save {|user| user.login = login.downcase}
于 2013-09-24T16:42:20.373 に答える
1

これを試してください:

アクティブなレコードsaveは true または falsecreateを返します。代わりに使用してみてください。これはオブジェクト自体を返します。

def create
  login = params[:username].downcase
  password = params[:password]
  tuser = User.create(login: login, password: password)
  if(tuser.errors.any?)
    flash[:title]='¡Error!'
    flash[:notice]='Please verify your data'
  else
    flash[:title]='¡Success!'
    flash[:notice]='Your account was created'
  end
end
于 2013-09-24T16:54:50.537 に答える