如何将字符串永久转换为数组ruby

时间:2017-05-02 02:52:19

标签: arrays ruby string

我有以下标签字符串

tags = "Investor, Real Estate, property Management"

我想要的输出是

tags = ["Investor", " Real Estate", " property Management"]

我正在创建一个before validation方法,将标记字符串更改为数组。我使用split来更改用逗号分隔的字符串。

但是,它不会永久地将字符串更改为数组,只是将其显示为数组,但标记仍然是字符串。我需要像拆分一样的东西!但我不相信存在。如何在验证之前将字符串永久更改为数组?我打算做

之类的事情

我的模特

 class Blog::Post
  include Mongoid::Document
  include Mongoid::TagCollectible::Tagged

    before_validation :downcase_tags, :make_array

    validates_presence_of :body, :title, :summary

 ...

    def make_array
      if self.tags.present?
        self.tags.split(",")
        self.tags.save
      end
    end

我的表格如下:

...
    <div class="field">
      <%= f.label :tags %><br>
      <%= text_field_tag 'blog_post[tags]' %>
    </div>
   <br \>
    <div class="actions">
     <%= f.submit("Submit", class: "btn btn-default btn-sm") %>
    </div>
<% end %>

控制器

...
  def create
    @blog_post = Blog::Post.new(post_params)
    @blog_post.date = Time.now
    @blog_post.author = current_super_admin.name
    @blog_post.save
    respond_with(@blog_post)
  end

但这在模型中似乎并不正确,因为它不应该保存在模型中。我怎么能正确地做到这一点?

我这样做是因为我在博客文章中添加标签,标签是用逗号分隔的字符串,但我需要数组中的标签来查询它们。

2 个答案:

答案 0 :(得分:1)

拆分不会更改从中调用的对象,您需要明确说明要更改标记的值

def make_array
  if self.tags.present?
    self.tags = self.tags.split(",")
    # self.tags.save
  end
end

您还可以在控制器中执行以下操作

@blog_post.tags = post_params.fetch(:tags, []).split(',').map(&:downcase).map(&:strip)

然后就不需要在模型中做任何事情了

答案 1 :(得分:0)

这是不可能的。 Ruby对象无法改变他们的类。看起来你可能会想到Smalltalk的become:让一个对象成为另一个对象,可能是另一个对象,但Ruby没有become: