簡體   English   中英

Ruby on Rails在控制器上獲取驗證錯誤消息

[英]Ruby on Rails get validation error messages on controller

我是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上使用了以下Flash對象來呈現引導程序模式:

<% 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全局變量來獲取驗證錯誤消息,我需要在contoller上進行處理。 誰能幫我?

謝謝

當您調用保存時,它將進行驗證,如果保存成功,則返回True否則,返回False ,因此您在調用save時將tuser設置為TrueFalse 如果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}

試試看:

活動記錄save返回true或false,請嘗試使用create來返回對象本身。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM