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



我想在保存之前更改从输入字段获得的值。

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。

相关内容

  • 没有找到相关文章

最新更新