我希望在保存之前更改输入字段中的值。
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
提前致谢
现在它起作用了,而不是caley:
class Link < ActiveRecord::Base
before_save(:on => :create) do
self.url = self.url.split('facebook.com/').last
end
答案 0 :(得分:2)
我投票在模型中尝试使用before_save或after_validation回调来运行您创建的自定义方法。您还可以将(:on =&gt;: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应用程序中做了类似的事情,我在here
上做了一些工作答案 1 :(得分:1)
您可以使用“after_validations”回调来进行更改吗?这应该称为后验证,并在调用保存之前。
http://ar.rubyonrails.org/classes/ActiveRecord/Callbacks.html#M000065
答案 2 :(得分:0)
@link = Link.new(:link => url)
或
@link = Link.new
@link.link = url
我假设您想要保存的属性'redbull'在上面的代码中被命名为链接。
答案 3 :(得分:0)
一种方法是使用哈希的delete
方法删除密钥:link
并手动设置链接属性。
与验证后一样,如果对象为valid?
,则可以在将params.delete(:link)
变为ex之前的变量之前说明@uri = params[:link]['url']
。 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
。
代码可能如下所示:
{{1}}
此方法未经过测试,但可能有效。
<强>更新强> 就像我说的,这是你可以做到这一点的方法之一。其他方法是使用任何回调方法,如before_save或after_validation。