【问题标题】:how do I make changes to inpus from edit/update in Rails?如何更改 Rails 中编辑/更新的输入?
【发布时间】:2011-01-05 01:33:06
【问题描述】:

我让他在我的控制器更新操作中跟踪代码。代码在创建时有效,但在更新时似乎没有启动:

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

结束

【问题讨论】:

    标签: ruby-on-rails activerecord model


    【解决方案1】:

    这些应该在您的模型中。 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
    ...
    

    编辑:

    正如我在评论中提到的,在存储、效率和索引方面,最好在数据库中存储为无符号的 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
    

    【讨论】:

    • @seth.vargo 不要离题太远...呵呵,您知道如何使用 shoulda 来为此编写测试吗?我不确定....
    • @seth.vargo -- 这里有一个问题 -- 它第一次工作,添加 1 并保存到字段中。但是当我打开并编辑该记录时会发生什么。然后它会添加 second "1"(需要将 1 设为 "1" 字符串)...
    • @seth.vargo -- 是的,它第一次工作......但随后的时间,它不断添加一个“1”
    • @Angela - 我不使用应该(之前错过了你的评论),所以很遗憾我没有。我建议提出另一个问题。
    • 非常好 -- 哇,你的答案得了 6 分,这是一个很好的答案,谢谢。
    【解决方案2】:

    您永远不会在您的unless 块中对@contact 调用save,因此您对@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,但这会绕过验证。

    您也可以在Contact 类中使用before_save 回调,但您必须检查phonefax 是否已经“标准化”。

    【讨论】:

    • 这应该可以解决它,所以我不会添加答案。请注意,您需要在 UPDATE 方法中处理 POST 参数,然后它们才会存在于您的模型中。在更新属性之前或之后保存它并不重要,但在更新属性之前,从表单输入的内容无法通过@contact.fax 等方式获得。
    • 好的,我想我明白了...如果我将规范化放入模型中,即使更新也会这样做?
    猜你喜欢
    • 2020-01-20
    • 2018-04-22
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    相关资源
    最近更新 更多