объединение фамилии и имени в модели Rails 3 - PullRequest
0 голосов
/ 27 апреля 2011

ЗАКЛЮЧИТЕЛЬНОЕ РЕШЕНИЕ:

У меня есть приложение Rails 3, которое использует Devise для обработки аутентификации.В форме регистрации у меня есть следующие поля:

  <p><%= f.label :first_name %><br />
  <%= f.text_field :first_name %></p>

  <p><%= f.label :last_name %><br />
  <%= f.text_field :last_name %></p>

Мне нужно использовать заглавные буквы и фамилии и объединить их в модели User в поле базы данных с именем 'login' (например, Фамилия, Имя).Вот полная модель пользователя:

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable, 
         :recoverable, :rememberable, :trackable, :validatable

  attr_accessible :first_name, :last_name, :email, :password, :password_confirmation, :remember_me, :login

  validates :first_name, :last_name, :email, :password, :password_confirmation, :presence => true

  before_create :create_login

  def create_login
    self.login = "#{last_name.capitalize}, #{first_name.capitalize}"
  end

end

Спасибо.

Ответы [ 2 ]

1 голос
/ 27 апреля 2011

Я искренне, честно и искренне приветствую использование вами силы Ruby, но, поскольку это такая простая и статичная конкатенация двух строк, я бы сказал:

def create_login
    login = "#{last_name.capitalize}, #{first_name.capitalize}"
end

Что касается проблемы nil:NilClass, добавляете ли вы столбцы first_name и last_name в таблицу пользователей в связанной миграции?

1 голос
/ 27 апреля 2011
before_create :create_login
validates :first_name, :presence => true
validates :last_name, :presence => true

def create_login
  login = [last_name, first_name].map(&:capitalize).join(", ")
end

Краткое объяснение

Я думаю, что это хорошо, чтобы получить first_name и last_name при регистрации: так что мы будем проверять его. Также рекомендуется проверить длину и сопоставить ее с некоторым регулярным выражением.

Затем, поскольку вход в систему создается только один раз, мы добавим before_create обратный вызов, который будет выполняться только при создании объекта (без обновления). before_create обратный вызов будет выполняться, только если проверка пройдена, поэтому, если first_name или last_name пусто - проверка не будет пройдена, и обратный вызов не будет выполнен до тех пор, пока first_name и last_name не будет заполнено. 1014 *

UPD

Хорошо, насколько вы получили ошибку:

def create_login
  login = [last_name, first_name].compact.map(&:capitalize).join(", ")
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...