【问题标题】:Rails Gem does not set the setter methodRails Gem 没有设置 setter 方法
【发布时间】:2014-03-14 23:20:51
【问题描述】:

我尝试根据 Railscast Episode 033 Making a Plugin 创建一个 Ruby Gem。我创建了 gem 并以 stringify-time 的身份上传到 Rubygems.org,但 setter 方法不起作用。

The GitHub Repo

宝石的主要部分

module StringifyTime
  def stringify_time(*names)
    names.each do |name|
      define_method "#{name}_string" do
        read_attribute(name).to_s(:db) unless read_attribute(name).nil?
      end

      define_method "#{name}_string=" do |time_str|
        begin
          write_attribute("#{name}", Time.zone.parse(time_str))
        rescue ArgumentError
          instance_variable_set("@#{name}_invalid", true)
        end
      end

      define_method "#{name}_invalid?" do
        instance_variable_get("@#{name}_invalid")
      end
    end
  end
end

ActiveRecord::Base.send(:extend, StringifyTime)

传入一个属性符号并创建getter 和setter 方法。 getter 方法有效,但是当我尝试通过表单更新属性时,数据没有保存。

在Task模型中使用stringify_time方法

class Task < ActiveRecord::Base                                            
  validates_presence_of :name                                              
  stringify_time :due_at                                                   

  # def due_at_string                                                      
  #   due_at.to_s(:db)                                                     
  # end                                                                    

  # def due_at_string=(due_at_str)                                         
  #   self.due_at = Time.parse(due_at_str)                                 
  # rescue ArgumentError                                                   
  #   @due_at_invalid = true                                               
  # end                                                                    

  def validate                                                             
    errors.add :due_at, 'is invalid' if due_at_invalid? # @due_at_invalid  
  end                                                                      
end

当我取消注释我手动编写的setter方法时,我可以编辑属性。

【问题讨论】:

  • 您是否尝试过从 Rails 控制台测试生成的方法?另外,生成的方法和手写的方法还是有很大区别的。

标签: ruby-on-rails ruby activerecord gem


【解决方案1】:

在我尝试使用 rails 控制台中生成的方法(如 cmets 中建议的 @matjis-van-zuijlen)之后,我能够更新 due_at 属性。问题是我没有在控制器中将 :due_at_string 列入白名单。

def task_params                                                                                                                                       
  params.require(:task).permit(:name, :due_at, :due_at_string)                                                                                        
end 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-07
    • 1970-01-01
    相关资源
    最近更新 更多