我是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对象来渲染一个bootstrap模式:
<% 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">× </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全局变量来获取验证错误消息,我需要在控制器上处理它们。 ¿任何人都可以帮助我吗?
由于
答案 0 :(得分:4)
当您调用save时,验证然后如果保存成功则返回True
;如果不成功,则返回False
,因此您将tuser设置为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}
答案 1 :(得分:1)
试试这个:
活动记录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