用空格显示Gsub输入

时间:2013-08-25 19:11:54

标签: ruby-on-rails ruby-on-rails-4 gsub string-substitution

我有一个:name属性,用于链接到用户的显示配置文件。

我需要在数据库中存储没有间距所以我使用了Gsub。

def name=(value)
        write_attribute(:name, value.gsub(/\s+/, ""))
end

但是在某些Show Page上再次显示该值

<%= link_to @show.name, @show %>

名称get显示没有Spaces。

我试过

raw(@show.name)

但这也没有用。

如何维护链接中的无间距,但在任何页面上显示空格?

我的模特:

class Show < ActiveRecord::Base

    belongs_to :user

    validates :name, :presence => true, :uniqueness => true
    validates :announcement, length: { maximum: 250 }

    # Show Cover
    has_attached_file :cover, styles: { show_cover: "870x150#"}
    validates_attachment :cover,
                                             content_type: { content_type: ['image/jpeg', 'image/jpg',
                                                                                                            'image/png'] },
                                             size: { less_than: 5.megabytes }


    def to_param
        name
    end

    def name=(value)
        write_attribute(:name, value.gsub(/\s+/, ""))
    end

end

2 个答案:

答案 0 :(得分:1)

如果空格是问题,为什么不将它们转换为下划线然后使用帮助器来显示?

def name=(value)
  write_attribute(:name, value.gsub(/\s+/, "_"))
end

然后,您可以创建一个仅用于打印/显示名称的辅助方法。

  • 创建app/helpers/users_helper.rb
  • 在这个帮手中加入这样的东西:

    module UsersHelper
      def pretty_name(user)
        user.name.gsub('_', ' ')
      end
    end
    
  • 在您看来,您可以通过执行以下操作来调用它:<%= pretty_name(@user) %>

如果在名称字段中使用分隔符不是一个选项,那么您应该考虑修改users表以使first_namemiddle_namelast_name等< / p>

答案 1 :(得分:1)

  

我主要显示它。在各种控制器上。

如果仅用于显示,请不要删除空格。存储实际名称,然后定义方法username,从名称中删除空格。

以下内容应该有效:

# Model
class Show < ActiveRecord::Base
    # Returns name removing all spaces
    def username
      self.name.gsub(/\s+/, "")
    end

    # Remove just the leading and trailing white spaces
    def name=(value)
        write_attribute(:name, value.strip)
    end
end

然后在您的控制器中:

<%= link_to @show.username, @show %>

更新:

与OP聊天后,了解他正在to_param模型中使用Show方法返回username(即name并删除了所有空格)。这导致find方法中的问题,因为DB中的值包括空格并且被搜索的值没有任何空格,因此需要使用DB特定函数,例如,在MySQL的情况下where("replace(name, ' ', '') = ?", user_name)。由于OP在开发和生产中使用不同的数据库,即开发中的SQLite和生产中的PG。因此,建议OP使用FriendlyId gem

,而不是制定跨不同数据库的解决方案