изменить параметры [: link] перед @ link.save - PullRequest
1 голос
/ 04 мая 2011

Я хочу изменить значение, которое я получаю из поля ввода, прежде чем сохранить его.

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

Заранее спасибо

Теперь это работает, спасибо Кейли:

class Link < ActiveRecord::Base

  before_save(:on => :create) do
    self.url = self.url.split('facebook.com/').last 
  end

Ответы [ 4 ]

2 голосов
/ 04 мая 2011

Я бы проголосовал за попытку обратного вызова 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

Обязательно настройте любые методы получения или установкидля доступа к ссылке в случае необходимости.Я сделал что-то похожее в приложении rails 3, я немного поработал над здесь

1 голос
/ 04 мая 2011

Можете ли вы использовать обратный вызов after_validations для внесения изменений? Это следует называть проверкой после публикации и перед вызовом сохранения.

http://ar.rubyonrails.org/classes/ActiveRecord/Callbacks.html#M000065

0 голосов
/ 04 мая 2011

Один из способов - использовать метод хеширования 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

Этот метод не проверен, но может работать.

Обновление: Как я уже сказал, это один из способов сделать это.Другой способ - использовать любой из методов обратного вызова, например before_save или after_validation.

0 голосов
/ 04 мая 2011
@link = Link.new(:link => url)

или

@link = Link.new
@link.link = url

Я предполагаю, что атрибут, к которому вы хотите сохранить 'redbull', является именованной ссылкой в ​​приведенном выше коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...