Rails 5, Каков один из лучших способов установить отношения с Devise с другой моделью? - PullRequest
0 голосов
/ 14 июня 2019

Я имею в виду, что пользовательская модель od Devise работает для хранения имени пользователя и пароля, а также для управления сеансами.Но я стараюсь связать это с моделью или таблицей, например, с именем Employee.enter image description here

Наконец, я прочитал Доступные обратные вызовы , но я дезориентирован, и после многих часов тестирования и практики я не нашелКак мне нравится, и у меня есть несколько вопросов:

• Есть ли способ, которым в одной форме вы можете заполнить данные о сотруднике и создать пользователя Devise ?.Только администратор может зарегистрироваться или зарегистрировать сотрудников.Сотрудники не делают этого сами.

• На MVC, где я могу работать, чтобы создать пользователя, выполнить проверки обеих моделей, а также CRUD?.

Этот код работает, но не совсем хорошо, я работаю над ним.

• Форма сотрудника имеет поля, ничего не имеет значения.

app / views / employee / _form.html.erb

<%= form_with(model: @employee, local: true, html: {autocomplete: "off"}) do |form| %>
  <div class="field">
    <%= form.label :name %>
    <%= form.text_field :name %>
  </div>
  <div class="field">
    <%= form.label :email %><br />
    <%= form.email_field :email, autofocus: true, autocomplete: "email" %>
  </div>
  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>

• На контроллере все нормально, CRUD работает.Но я работаю над этим, просто тестирую:

app / controllers / employee_ employee_controller.rb

класс EmployeesController

  # GET /employees/new
  def new
    @employee = Employee.new
  end

  # GET /employees/1/edit
  def edit
  end

  # POST /employees
  # POST /employees.json
  def create
    @employee = Employee.new(employee_params)
   if employee_params[:email].present?
     if @employee.new_record?
        set_employees_email
     end
   end

    respond_to do |format|
      if @employee.save

        format.html { redirect_to @employee, notice: 'Employee was successfully created.' }
        format.json { render :show, status: :created, location: @employee }
      else
        format.html { render :new }
        format.json { render json: @employee.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /employees/1
  # PATCH/PUT /employees/1.json
  def update
    if employee_params[:email].present?
      # if !employee.email.empty?
      if @employee.email.persisted?
        update_employees_email
      end
    end
    respond_to do |format|
      if @employee.update(employee_params)
        format.html { redirect_to @employee, notice: 'Employee was successfully updated.' }
        format.json { render :show, status: :ok, location: @employee }
      else
        format.html { render :edit }
        format.json { render json: @employee.errors, status: :unprocessable_entity }
      end
    end
  end

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

    # Never trust parameters from the scary internet, only allow the white list through.
    def employee_params
      params.require(:employee).permit(:name, :description, :email)
    end

def set_employees_email?
      ## Set employee to a Users
      @user = User.new
      @user.email =  employee_params[:email]
      @user.teacher = true
      @user.school_id = current_user.school_id
      @user.password = "password"
      unless @user.validate!
        redirect_to employess_path, notice: @user.errors.full_messages
        flash[:danger] = "Sorry   #{@user.errors.full_messages}"
      else
        @user.save
      end
end

    def update_employees_email?
      ## find User to Update
      @user = User.where("employee_id = ?", employee_params[:id])
      @user.email = employee_params[:email]
      @user.skip_email_changed_notification!
      unless @user.validate!
        redirect_to employess_path, notice: @user.errors.full_messages
        flag = false
      else
        @user.save
        flag = true
      end
    end
    end

• И в Моделях user.rb и employee.rb у меня нет ничего о предмете, только проверка электронной почты и другие вещи.Следует отметить, что для каждого сотрудника не обязательно иметь сессионный счет (Пользователь).

Заранее благодарю за помощь, любые рекомендации или необходимые изменения в логике, я ценю это.

...