Сохранение атрибута в другую модель при создании

#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 проверит, действителен ли профиль, и выдаст сообщение об ошибке при сохранении «Профиль недействителен», если вы попытаетесь ввести что-то, что недопустимо.