Как обновить ассоциации модели RoR без обновления атрибутов соответствующей модели - PullRequest
2 голосов
/ 12 апреля 2011

В моем приложении на Rails 3 есть следующие модели (с соответствующими таблицами базы данных):

class User < ActiveRecord::Base
  has_many :service_users
  has_many :services, :through => :service_users

  attr_accessor :password

  attr_accessible :password, :password_confirmation, :service_ids

  validates :password, :presence => true,
                       :confirmation => true,
                       :length => { :within => 6..40 }
  ...
end

class Service < ActiveRecord::Base
  has_many :service_users
  has_many :users, :through => :service_users
  ...
end


class ServiceUser < ActiveRecord::Base
  belongs_to :service
  belongs_to :user
end

#User Controller:

class UsersController < ApplicationController
  ...
  def update
    @user = User.find(params[:id])
    if @user.update_attributes(params[:user])
      flash[:success] = "Profile updated."
      redirect_to @user
    else
      @title = "Edit user"
      render 'edit'
    end
  end
  ...
end

Я хочу иметь возможность обновлять связанные службы модели пользователя без указания пароля и атрибутов подтверждения пароля. Как я могу это сделать?

Ответы [ 3 ]

4 голосов
/ 12 апреля 2011

Два варианта ...

Если у вас простая логика, например проверка пароля при создании пользователя, это будет работать:

validates :password, :presence => true,
                     :confirmation => true,
                     :length => { :within => 6..40 },
                     :if => :new_record?

Скорее всего, вы будетехотите комбинацию, чтобы пользователи могли обновить свой пароль:

validates :password, :presence => true,
                     :confirmation => true,
                     :length => { :within => 6..40 },
                     :if => :is_password_validation_needed?

# Protect the password attribute from writing an
# empty or nil value
def password=(pass)
  return if !pass.present?
  @password = pass
end

private 

  def is_password_validation_needed?
    # Return true if the record is unsaved or there
    # is a non-nil value in self.password
    new_record? || password
  end
2 голосов
/ 12 апреля 2011
0 голосов
/ 12 апреля 2011

вы захотите изучить условную проверку, чтобы указать, должен ли атрибут пароля в вашей модели проверяться при обновлении / сохранении модели. Вот эпизод Railscast , который, хотя и немного устарел, но все же довольно прост и должен привести вас на правильный путь

...