2011-01-05 57 views
1

我有他在控制器的更新操作中的代码。代码工作时创建,但似乎并没有踢下更新:如何从Rails中的编辑/更新中更改inpus?

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 

回答

6

这些应该是你的模型。 FAT模式,紧身控制器:

# 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 
... 

编辑:

正如我在我的评论中提到,它在存储和效率和索引方面更好地为BIGINT的无符号存储在数据库中,并添加对方法中的数字可爱。这样,你的网站总是被标准化(没有两个电话号码看起来不一样,因为它们是'即时'格式化的)。

# 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 
+0

@Angela - 为您做了这项工作吗? – sethvargo 2011-01-10 02:22:09

+0

我正在尝试它...我尝试了nother方法...我希望这个作品,我喜欢它... – Angela 2011-01-11 01:30:44

+0

@ seth.vargo不要太离题远... ... heheh,你会知道如何使用shoulda来为此写一个测试?我不确定.... – Angela 2011-01-11 01:32:18

1

你永远不会呼吁@contactsaveunless块,所以你要@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类,但你必须检查phonefax已经“正常化”。

+0

这应该修复它,所以我不会添加答案。请注意,您需要在UPDATE方法中处理POST参数,然后它们将存在于模型中。不要紧,如果你在更新属性之前或之后保存它,但直到你更新属性,从窗体输入的内容不能通过'@ contact.fax'等东西获得。 – Andrew 2011-01-05 02:01:11

+0

好吧,我想我明白了......如果我将标准化放入模型中,即使更新也会这样做吗? – Angela 2011-01-05 15:55:13