在@ link.save之前更改params [:link]

时间:2011-05-04 10:30:36

标签: ruby ruby-on-rails-3

我希望在保存之前更改输入字段中的值。

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

4 个答案:

答案 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。