我有以下标签字符串
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
但这在模型中似乎并不正确,因为它不应该保存在模型中。我怎么能正确地做到这一点?
我这样做是因为我在博客文章中添加标签,标签是用逗号分隔的字符串,但我需要数组中的标签来查询它们。
答案 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:
。