我想在保存之前更改从输入字段获得的值。
params[:link]['url'] = "www.facebook.com/redbull"
现在我只想把"redbull"放到数据库中。以下代码失败,因为它在验证前更改了params[:link]
。我想在有效验证后执行它。
def create
url = params[:link]['url'].split('facebook.com/').last
params[:link]['url'] = url
@link = Link.new(params[:link])
if @link.save
flash[:success] = 'Link was successfully created.'
redirect_to root_path
else
render 'new'
end
end
提前感谢
现在它工作了,thx到caley:
class Link < ActiveRecord::Base
before_save(:on => :create) do
self.url = self.url.split('facebook.com/').last
end
我会投票支持在模型中尝试before_save或after_validation回调来运行您创建的自定义方法。您也可以将(:on=>:create(添加到before_save回调中,这样它就不会在更新时运行。
类似的东西
class Thing < ActiveRecord::Base
before_save :clean_link
def clean_link
self.link = self.link.split('facebook.com/').last
end
如果需要的话,一定要设置任何getter或setter来访问链接。我在rails 3应用程序中做了类似的事情,我在这里做了一些工作
您可以使用"after_validations"回调进行更改吗?这应该称为验证后和调用save之前。
http://ar.rubyonrails.org/classes/ActiveRecord/Callbacks.html#M000065
@link = Link.new(:link => url)
或
@link = Link.new
@link.link = url
我假设您想要保存"redbull"的属性在上面的代码中被命名为link。
一种方法是使用Hash的delete
方法来移除密钥:link
,并手动设置链接属性。
与验证后一样,如果对象是valid?
,则在将其放入例如@uri = params[:link]['url']
的变量之前,可以说params.delete(:link)
而不是。
代码可能看起来像这样:
def create
url = params[:link]['url'].split('facebook.com/').last
@link = Link.new(params[:link])
if @link.valid?
@link.url = url
@link.save
flash[:success] = 'Link was successfully created.'
redirect_to root_path
else
render 'new'
end
end
此方法未经测试,但可能有效。
更新:就像我说的,这是你可以做到这一点的方法之一。另一种方法是使用任何回调方法,如before_save或after_validation。