【问题标题】:Rails - attr_accessible & mass assignmentRails - attr_accessible & mass assignment
【发布时间】:2010-10-31 09:51:30
【问题描述】:

我有一个关于在 Rails 中使用 attr_accessible 的问题。

我有时想将guard_protected_attributes 设置为false 以绕过批量分配保护。我想知道为什么以下行不起作用(它会产生“无法字符串化键”错误):

@user.attributes=({ :name => "James Bond", :admin => true }, false)

...但确实如此:

@user.send(:attributes=, { :name => "James Bond", :admin => true }, false)

有人知道原因吗?

【问题讨论】:

    标签: ruby-on-rails ruby mass-assignment


    【解决方案1】:

    因为 Ruby 解析器将 '{ :name => "James Bond", :admin => true}, false' 解析为 #attributes=single 参数。调用方法 'foo=' 将您限制为 Ruby 中的一个参数。 send 解决了这个问题。

    实际发生的情况是 Rails 正在尝试对 false 的键进行字符串化,而 FalseClass 而不是 Hash,没有任何键。

    【讨论】:

    • 谢谢,这让我快疯了!
    • 我实际上在 IRB 中进行了一些测试。单个参数是一个数组,它也不能字符串化它的键。
    • 我只想看到一个数组将其键字符串化。
    • 好的,戴夫:Array.class_eval { def stringify_keys;结果 = {}; each_with_index { |x,i| reuslt["#{i}"] = x };结果 }。但我个人没有用它:)
    【解决方案2】:

    我想看看你们是否会跟进这个,所以我必须使用 .send 或者是否有更好的方法?

    【讨论】:

      【解决方案3】:

      我最后只是定义了一些辅助方法,以便更容易绕过批量分配限制。

      module ActiveRecord
        class Base
      
          # Assigns attributes while ignoring mass assignment protection
          def force_feed(attributes)
            self.send(:attributes=, attributes, false)
            self
          end
      
        end
      end
      

      【讨论】:

        【解决方案4】:

        在更高版本的 ActiveRecord 中,attributes= 的第二个参数被去掉了。您现在可以调用相同的效果:

        model.assign_attributes(attributes, :without_protection => true)
        

        【讨论】:

          猜你喜欢
          • 2015-11-22
          • 2017-10-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多