【问题标题】:Rails and Mongoid :: Converting Strings to ArraysRails 和 Mongoid :: 将字符串转换为数组
【发布时间】:2011-10-14 08:33:44
【问题描述】:

我在一个不错的 javascript UI 小部件中收集标签。然后它获取所有标签并将它们作为 tag1、tag2、tag3 等在一个 text_field 输入中传递给服务器。服务器接收它们:

params[:event][:tags] = params[:event][:tags].split(',') # convert to array
@event = Event.find(params[:id])

有没有更好的方法将字符串转换为数组?这似乎是一种代码气味。我必须把它放在更新和控制器的新动作中。

【问题讨论】:

    标签: ruby-on-rails ruby mongodb mongoid


    【解决方案1】:

    你可以在模型中这样做:

    我很少有关于 mongoid 的经验。以下将在活动记录中工作(唯一的区别是 write_attribute 部分)

    class Event
      def tags=(value_from_form)
        value_from_form = "" unless value_from_form.respond_to(:split)
    
        write_attribute(:tags, value_from_form.split(','))
      end
    end
    

    另一方面,为了保持一致性,您可能需要执行以下操作:

    class Event
      def tags_for_form=(value_from_form)
        value_from_form = "" unless value_from_form.respond_to(:split)
    
        self.tags = value_from_form.split(',')
      end
    
      def tags_for_form
        self.tags
      end
    
      # no need to change tags and tags= methods. and tags and tags= methods would return an array and accept an array respectively
    end
    

    在第一种情况下(直接覆盖tags= 方法),tags= 接受字符串但tags 返回一个数组。

    在第二种情况下,tags_for_form=tags_for_form 接受并返回字符串,而tags=tags 接受并返回数组。

    【讨论】:

    • 第二个例子看不懂,tag=和tags怎么能这样接受数组呢?它也不起作用。
    • 第二种方式,不要在表单中直接使用tags。即f.text_field :tags_for_form。当对象接收到该值时,它会将其拆分并将数组存储到tags=。所以tags= 期望接受一个数组(如果你给它分配一个字符串,它会失败)。
    【解决方案2】:

    我只是创建另一个包装标签属性的模型属性,如下所示:

    class Event
      def tags_list=(tags_string)
        self.tags = tags_string.split(',').map(&:strip)
      end
    
      def tags_list
        self.tags.join(',')
      end
    
    end
    

    在您的表单中,只需读取/写入将始终接受或返回预格式化字符串的 tags_list 属性。 (.map(:strip) 部分只是删除两端的空格,以防标签输入空格:tag1, tag2, tag3

    【讨论】:

      【解决方案3】:

      PeterWong 的回答错过了“?”来自 respond_to() 方法;

        class Event
          def tags=(value_from_form)
            value_from_form = "" unless value_from_form.respond_to?(:split)
      
            write_attribute(:tags, value_from_form.split(','))
          end
        end
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-02
      • 2017-11-27
      • 2015-11-11
      • 2011-06-18
      相关资源
      最近更新 更多