【问题标题】:Ruby on Rails get validation error messages on controllerRuby on Rails 在控制器上获取验证错误消息
【发布时间】:2013-09-24 16:32:00
【问题描述】:

我是 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 全局变量来获取验证错误消息,我需要在控制器上处理它们。 ¿ 谁能帮帮我?

谢谢

【问题讨论】:

    标签: ruby-on-rails ruby flash validation twitter-bootstrap


    【解决方案1】:

    当您调用 save 时,它​​会验证并返回 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}
    

    【讨论】:

      【解决方案2】:

      试试这个:

      活动记录 save 返回真或假,尝试使用 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-08
        • 2022-01-26
        • 1970-01-01
        • 1970-01-01
        • 2014-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多