Welcome to SpiceShop Theme

Sea summo mazim ex, ea errem eleifend definitionem vim. Ut nec hinc dolor possim mei ludus efficiendi ei sea summo mazim ex.

Rails关联Model的验证

Rails关联Model的验证

这也恐怕是第一篇关于Rails的纯粹的技术文章.
这篇文章很简单,就是Rails的验证问题.

问题
 å‡å¦‚有一个User model,而这个User又带有一个Profile model. Userå’ŒProfile的代码分别为:

User 代码
  1. class User < ActiveRecord::Base  
  2.   has_one :profile  
  3.   validates_presence_of :password,:on => :create,:message =>"Password can’t be empty!"  
  4.   validates_presence_of :password_confirmation,:on => :create,:message =>"Please re-type password!"  
  5.   validates_format_of :email,:on => :create,:message => "Email is invalid!",:with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i  
  6.   validates_uniqueness_of :email:on => :create  
  7.   validates_length_of :password,:password_confirmation:minimum => 4,:message=>"Password must be 4-40 characters or digits! "  
  8. end  



User包含email,以及密码

Profile代码
  1. class Profile < ActiveRecord::Base  
  2.   belongs_to :user  
  3.   validates_presence_of :firstname,:message=>"First name is required"  
  4.   validates_presence_of :lastname,:message=>"Last name is required"  
  5. end  

Profile仅有first name和last name.

User对应的Controller是UserController,而Profile没有对应的Controller,所有操作都在UserController里完成,当然包括editprofile,以及updateprofile.

ruby 代码
 

  1. class UsersController < ApplicationController  
  2.    
  3.   def editprofile  
  4.     current_user.profile  
  5.  end  
  6.   
  7. def updateprofile  
  8.     if current_user.profile.nil?  
  9.       @profile = Profile.new(params[:profile])  
  10.       @profile.user = current_user  
  11.       begin  
  12.        @profile.save!  
  13.       rescue  
  14.         redirect_to :back  
  15.         return  
  16.       end  
  17.     else  
  18.       @profile = current_user.profile  
  19.       unless @profile.update_attributes(params[:profile])  
  20.         redirect_to :back  
  21.         return  
  22.       end  
  23.     end  
  24.   end  
  25.   
  26. end  

在updateprofile里,如果firstname或last name为空的,是可以验证的,但是无法在view上显示.也就是说error_messages_for ‘profile’不工作.

分析
   按照常理,profile应该对应有controllerçš„,但是有的时候为了统一,也许不会那么做.所以在处理的时候一定要注意.那么在profile保存的时候,进行验证,这个操作是可以进行的,但是为什么在editprofileæ—¶error_messages_for ‘profile’没有反应呢?那只能说明@profile里的errors是空的,那么@profileçš„erros是空的?前面明明已经得到验证了,所以应该不为空.究竟是什么原因呢?看看editprofile,发现问题了吧,原来此profileå’Œupdateprofile提交的是不一样的.前者是没有errorsçš„.

解决

既然知道了原因所在,那就非常简单了,直接把提交的profile赋值给editprofile的profile.可以采用session,缓存将提交的profile对象存储起来就OK了.

总结
 Rails其实原理比较简单的,关键是有的时候要符合框架的基本意图,也正因为是个框架,其带来的条条框框有时候会令人抓狂.如果实在搞不懂,那就看看Rails里的源代码,了解其来龙去脉吧.

张太国

Comments are closed.