Как я могу внести изменения в Inpus от редактирования / обновления в Rails? - PullRequest
1 голос
/ 05 января 2011

У меня есть следующий код в моем действии обновления для контроллера. Код работает в процессе создания, но, похоже, не срабатывает при обновлении:

def update
 @contact = Contact.find(params[:id])

 # bug, why isn't this working? 
 unless @contact.fax.empty?
   @contact.fax = "1" + Phony.normalize(@contact.fax)
 end

 unless @contact.phone.empty?
   @contact.phone = "1" + Phony.normalize(@contact.phone)
end

if @contact.update_attributes(params[:contact])
   flash[:notice] = "Successfully updated contact."
   redirect_to @contact
 else
   render :action => 'edit'
 end

конец

Ответы [ 2 ]

6 голосов
/ 05 января 2011

это должно быть в вашей модели. Модель FAT, контроллер SKINNY:

# contact.rb
...
# may need require 'phony' and include Phony
before_save :prep

def prep
  self.fax = 1+Phony.normalize(self.fax) unless self.fax.empty? || (self.fax.length == 11 && self.fax[0] == 1)
  self.phone = 1+Phony.normalize(self.phone) unless self.phone.empty? || (self.phone.length == 11 && self.phone[0] == 1)
end
...

Edit:

Как я уже упоминал в своем комментарии, с точки зрения хранения и эффективности, а также индексации лучше хранить в качестве базы данных bigint unsigned в вашей базе данных и добавлять красивость к числам в методе. Таким образом, ваш сайт всегда нормализуется (никакие два телефонных номера не будут выглядеть по-разному, потому что они отформатированы «на лету»).

# sample methods
def phony
  str = self.phone.to_s
  "#{str[0..2]}-#{str[3..5]}-#{str[6..10]}"
end

# use a similar method for faxing, but I'll write
# this one differently just to show flexibility
def faxy
  str = self.fax.to_s
  "+1 (#{str[0..2]}) #{str[3..5]}-#{str[6..10]}"
end
1 голос
/ 05 января 2011

вы никогда не вызываете save на @contact в ваших unless блоках, поэтому ваш вызов @contact.update_attributes(params[:contact]) отменяет любые изменения, сделанные вами в этих блоках (потому что эти ключи в хэше params соответствуют пустым значениям) .

def update
  @contact = Contact.find(params[:id])

  if @contact.update_attributes(params[:contact])
    @contact.update_attributes(:fax   => "1" + Phony.normalize(@contact.fax))   unless @contact.fax.empty?
    @contact.update_attributes(:phone => "1" + Phony.normalize(@contact.phone)) unless @contact.phone.empty?

    flash[:notice] = "Successfully updated contact."
    redirect_to @contact
  else
    render :action => 'edit'
  end
end

Вы можете использовать update_attribute, но это обходит проверку.

Вы также можете использовать обратный вызов before_save в классе Contact, но вам придется проверить, являются ли phone или fax уже "нормализованными".

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