автоматически добавлять значение в базу данных столбцов в рельсах - PullRequest
0 голосов
/ 25 июня 2018

примечания используйте рельсы 5.2 и postgresql

у меня Foluser модель содержит name, email, password, id_watch

Мне нужно, когда админ добавляет новый foluser

  1. генерировать password

    когда администратор создает новый foluser генерирует password как Генератор безопасных паролей

  2. получите id_watch из admin модели и поместите в id_watch из Foluser модели

    Администратор when register enter имя пользователя , электронная почта , пароль , id_watch`

    в пункте 2 нужно взять этот id_watch и сохранить его в user модели.

Администратор только создать Foluser

`
class FolusersController < ApplicationController
  before_action :set_foluser, only: [:show, :edit, :update, :destroy]
  before_action :authenticate_user!, except: [:index, :show, :new , :create, :edit]

  # GET /folusers
  # GET /folusers.json
  def index
    @folusers = current_master.foluser.all

    #render json: @folusers

  end

  # GET /folusers/1
  # GET /folusers/1.json
  def show
    #@folusers = Foluser.where(master_id: @master.id).order("created_at DESC")

    #@foluser = Foluser.find(params[:id])
        #render json: @foluser



  end

  # GET /folusers/new
  def new
    @foluser = current_master.foluser.build
  end

  # GET /folusers/1/edit
  def edit
    #render json: @foluser
  end

  # POST /folusers
  # POST /folusers.json
  def create
    @foluser = current_master.foluser.build(foluser_params)


    respond_to do |format|
      if @foluser.save
        format.html { redirect_to @foluser, notice: 'Foluser was successfully created.' }
        format.json { render :show, status: :created, location: @foluser }
      else
        format.html { render :new }
        format.json { render json: @foluser.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /folusers/1
  # PATCH/PUT /folusers/1.json
  def update
    respond_to do |format|
      if @foluser.update(foluser_params)
        format.html { redirect_to @foluser, notice: 'Foluser was successfully updated.' }
        format.json { render :show, status: :ok, location: @foluser }
      else
        format.html { render :edit }
        format.json { render json: @foluser.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /folusers/1
  # DELETE /folusers/1.json
  def destroy
    @foluser.destroy
    respond_to do |format|
      format.html { redirect_to folusers_url, notice: 'Foluser was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_foluser
      @foluser = Foluser.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def foluser_params
      params.require(:foluser).permit(:name, :email, :numberphone, :password)
    end
end

foluser модель

class Foluser < ApplicationRecord
    belongs_to :admin, :optional => true
end

admin модель

class Master < ApplicationRecord

    has_many :foluser
end

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Используя ваш текущий код, установка id_watch может быть выполнена здесь, в контроллере:

class FolusersController < ApplicationController
  def create
    @foluser = current_master.folusers.build(foluser_params)

    @foluser.id_watch = current_master.id_watch # <-- !!!

    respond_to do |format|
      if @foluser.save
        # ...
      end
    end
  end
end

Несмотря на наш расширенный разговор выше, мне все еще неясно, чего вы пытаетесь достичь с помощью «генерации пароля».

(Должно ли оно быть сгенерировано во внешнем интерфейсе или во внутреннем интерфейсе? Должно ли оно храниться в зашифрованном виде или в виде простого текста? Если оно зашифровано, нужно ли иметь возможность отменить это шифрование? Это «постоянный» "пароль или" временный "пароль? ...)

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

В FolusersController вы определили следующий метод:

def foluser_params
  params.require(:foluser).permit(:name, :email, :numberphone, :password)
end

Однако, если вы хотите, чтобы пароль был сгенерирован сервером, вам не следует разрешать admin устанавливать пароль через контроллер. Поэтому удалите этот параметр:

def foluser_params
  params.require(:foluser).permit(:name, :email, :numberphone)
end

А потом где-нибудь - возможно, в контроллере или в качестве хука в модели - установите этот пароль на что-то случайное:

class FolusersController < ApplicationController
  def create
    @foluser = current_master.folusers.build(foluser_params)
    @foluser.password = SecureRandom.hex(10 + rand(6))
    # ...
   end
end

# or

class Foluser < ApplicationRecord
  after_initialize :default_password

  def default_password
    self.password ||= SecureRandom.hex(10 + rand(6))
  end
end
0 голосов
/ 25 июня 2018

Я думаю, что вы нашли решение, используйте обратные вызовы rails в вашей модели для извлечения логики такого типа из контроллера.

Но я бы предпочел использовать after_initialize, чем before_save, чтобы вы выиграли 't устанавливать пароль по умолчанию перед каждым сохранением (так что, возможно, даже обновлять действие)

Затем использовать такие вещи, как SecureRandom (проблема ActiveSupport) (уже в комплекте с rails, не требуется)

after_initialize :defaultpassword
...
def default_password
  self.password ||= SecureRandom.hex(10 + rand(6))
end

нелучший способ сделать случайный случай, я знаю, но не стесняйтесь настраивать его.

примеры вывода secure_random:

=>bf8d42b174d297f6460eef
=>efd28869171a1ec89c3438
=>3855c61fb6b90ed549d777
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...