-1

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

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

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

但是在通过某些显示页面再次显示该值时

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

名称 get 显示时没有空格。

我试过了

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
4

2 回答 2

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方法(即删除所有空格)。这导致了方法上的问题,因为 DB 中的值包含空格并且正在搜索的值没有任何空格,因此需要使用 DB 特定的函数,例如在 MySQL 的情况下。由于OP在开发和生产中使用不同的数据库,即开发中的SQLite和生产中的PG。因此,建议 OP 使用FriendlyId gem,而不是制定跨不同数据库工作的解决方案。Showusernamenamefindwhere("replace(name, ' ', '') = ?", user_name)

于 2013-08-25T19:44:52.947 回答
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_name, middle_name,last_name

于 2013-08-25T19:20:12.163 回答