#ruby-on-rails #ruby #methods
#ruby-on-rails #ruby #методы
Вопрос:
Каков наилучший способ решения этой проблемы.
Когда пользователь создается в моем приложении, вы вводите адрес электронной почты, который сохраняется в модели пользователя, что я хотел бы сделать, это также сохранить этот адрес электронной почты, чтобы указать модель профиля, чтобы я мог использовать его в другом месте в своем приложении. он не может быть отредактирован как часть модели профиля и изменится, если электронная почта изменится в пользовательской модели
Я немного не уверен в том, как подойти к этому, будет ли метод after_create работать для чего-то подобного?
Что касается синтаксиса, хотя я не уверен, как это начать
Ответ №1:
user.rb
class User < AR
after_create :create_profile
after_update :update_email
def create_profile
Profile.create(email: email)
end
def update_email
email_was = previous_changes['email'][1]
email_is = email
return nil if email_is == email_was
Profile.find_by(email: email_was).update_attributes email: email_is)
end
Ответ №2:
Вам понадобится accepts_nested_attributes_for
Модели:
class User
has_one :profile
accepts_nested_attributes_for :profile
validates_associated :profile
end
class Profile
belongs_to :user
validates :email, presence :true
end
Контроллер:
class UsersController
def new
@user = User.new
@user.build_profile
end
def create
@user = User.new(users_params)
@user.save
end
private
def users_params
params.require(:user).permit(:username, :profile_attributes => [:email])
end
Вид:
<%= form_for @user do |f| %>
#other user stuff
<%= f.fields_for :profile do |builder| %>
<div class="field">
<%= builder.label :email %>
<%= builder.text_field :email %>
</div>
<% end %>
<% end %>
Комментарии:
1. таким образом, это обновит модель пользователя и модель профиля, и пользователь будет вводить свой адрес электронной почты только один раз?
2. Да, как вы можете догадаться по названию, это позволяет пользователю принимать атрибуты для профиля, а затем сохранять их в профиле.
validates_associated :profile
проверит, действителен ли профиль, и выдаст сообщение об ошибке при сохранении «Профиль недействителен», если вы попытаетесь ввести что-то, что недопустимо.