论坛首页 编程语言技术论坛

关于rails的几个问题

浏览 10243 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-06-02  
1 validates的问题
有的时候我可能每次只需要update一个model某几个属性,比如对于User,我可能有几个方法,一个update name,email等属性,一个用来修改密码,这时候validates似乎很难写啊,
validates_presence_of :name, :email, :on=>:update

validates_presence_of :password, :on=>:update
validates_confirmation_of :password, :on=>:update

因为我一个update name,email的时候并没有password这个attr(password并不是persistent的,数据里保存的市password_hash),所以validate通不过

2 cookies的问题
用cookies[:key]只能读到cookie的值,但我有时候需要知道cookie的expires等其他属性,怎么办啊?

3 我在log文件里看到这样的sql
SELECT * FROM users WHERE (users.`name` = 'myname' )
UPDATE users SET `created_at` = '2006-06-02 17:21:44', `name` = 'myname'...
难道rails并没有使用占位符和参数?
   发表时间:2006-06-03  
1: 这个可以这么解决:
  validates_length_of :pass, :within => 5..40,n => :create
  validates_confirmation_of :pass, :if=> Proc.new { |u| u.pass.size > 0} 

2: API  中写了,.“ Cookies are read by value (so you won’t get the cookie object itself back — just the value it holds). ”

但是设置的时候可以 Hash 方式Set,为什么这么设计,不明白?

3:Log 输出的是已经完成替换的的 SQL 语句了,在 Controller 中写的时候,我尽量是使用 update_attributes(params[:user])  的方式来更新,这些函数其实就是使用占位符的。
0 请登录后投票
   发表时间:2006-06-03  
1 但是我改密码的时候也需要validate password呀

2 我也看到了

3 哦,这样啊。但是update_all好像不能用占位符的形式,下面这样不行
User.update_all "name='a'", :conditions => ['name = ?', 'b']

update_attributes(params[:user])这样似乎不是很安全,也许有些属性我并不想update,比如email,也许注册以后就不能改了,所以你必须要保证params[:user]里面没有:email的项,恶意的用户可能会直接给你传一个user[email]的参数
0 请登录后投票
   发表时间:2006-06-03  
用 before_create , before_update

  before_save:crypt_password

  def crypt_password
    if pass.empty?     
      xxxxxxxxxxxxx
    else
      xxxxxxxxxxxxx
    end    
  end
0 请登录后投票
   发表时间:2006-06-03  
stillanother 写道


3 哦,这样啊。但是update_all好像不能用占位符的形式,下面这样不行
User.update_all "name='a'", :conditions => ['name = ?', 'b']

update_attributes(params[:user])这样似乎不是很安全,也许有些属性我并不想update,比如email,也许注册以后就不能改了,所以你必须要保证params[:user]里面没有:email的项,恶意的用户可能会直接给你传一个user[email]的参数


1:你可以将那些需要同时更新的字段和单独更新的字段分开,用  attr_accessible 来定义那些 同时更新的字段 。

2:或者用 order = Order.find_by_sql ("select id,name,email from xxxx") 搜索要更新的记录,在Sql 中列出要更新的字段,然后

order.email = "eiffelqiu@hotmail.com"
order.save

这样就可以只保存更新你列出的字段了,这是 Rails Book 上说的。

3:也可以用 update(12,:name=>"test",:email=>"eiffelqiu@gmail.com" ) 的方式来更新
0 请登录后投票
   发表时间:2006-06-03  
stillanother 写道

3 哦,这样啊。但是update_all好像不能用占位符的形式,下面这样不行
User.update_all "name='a'", :conditions => ['name = ?', 'b']


好像是不能用占位符,我没具体用过, 不过你可以用 User.update_all "name='a'", "name = #{@name}" 这种形式,不过这种方法似乎不安全。 我上网查了查,最近由于GFW , 上不了 Google, 所以。。。。。 麻烦。

http://dev.rubyonrails.org/ticket/519

你说的这个问题好像已经解决了。
0 请登录后投票
   发表时间:2006-06-03  
......
再查下,呵呵~
0 请登录后投票
   发表时间:2006-06-03  
谢谢,受教了:arrow:
Rails Book是哪本书?
我有Agile Web Development with Rails,Ruby for Rails,Rails Recipes,不过没全部仔细看,那个浮躁呀:oops:
0 请登录后投票
   发表时间:2006-06-03  
stillanother 写道
谢谢,受教了:arrow:
Rails Book是哪本书?
我有Agile Web Development with Rails,Ruby for Rails,Rails Recipes,不过没全部仔细看,那个浮躁呀:oops:



Agile Web Development with Rails 一般被称为 Rails Book

Programming Ruby 一般被称为 Axe Book。
0 请登录后投票
   发表时间:2006-06-03  
可以了,这样
User.update_all ['name=?','a'], ['name=?','b']
寒啊,文档不够好
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics