2017-05-02 108 views
1

我已經標記我怎樣才能永久地把字符串轉換成一個數組紅寶石

以下字符串
tags = "Investor, Real Estate, property Management" 

我期望的輸出是

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

我創建一個驗證之前的方法來改變標籤串入數組中。我正在使用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

請注意,拆分不會剝離空間 – Bohdan

+0

你是否想做'str ='14'; str.replace(14)#=> TypeError:沒有將Fixnum隱式轉換爲String。您可以將任何類的實例替換爲同一類的另一個實例,但不能替換爲不同類的實例。當然,你可以寫'str = 14; str = 14'。 –

回答

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) 

那麼就不需要在模型中做任何事情

+0

在模型中保存模型的一部分還是不好,或者是不好的 – SupremeA

+0

我認爲這很糟糕,您能否添加更多關於如何初始化對象的信息以及之後爲什麼要更改'tags'? – Bohdan

+0

我添加了一些信息。我這樣做是因爲我將標籤添加到博客帖子中,標籤是用逗號分隔的表單中的字符串,但我需要數組中的標籤來查詢它們。 – SupremeA

0

這是不可能的。 Ruby對象不能改變他們的類。看起來你可能會想到Smalltalk的become:,它讓一個對象成爲另一個對象,可能是不同的類,但是Ruby沒有become:

+0

我假設你是指我的最後一條評論,關於刪除字段的類型,它保存爲字符串,然後保存到數組?那麼,也許我的邏輯是錯誤的,但刪除字段類型確實允許方法完成並保存模型。 – SupremeA

相關問題