【问题标题】:Creating employee with devise user使用设计用户创建员工
【发布时间】:2015-10-02 03:29:53
【问题描述】:

看起来像这样 Profile model for Devise users? 但我的不一样。

我想创建员工记录,并且该员工可以选择是否拥有用户帐户。我正在为我的用户使用 devise gem。

所以我有 Employee 模型

has_one :user
accepts_nested_attributes_for :user

和用户模型

belongs_to :employee

我知道我需要将嵌套用户放在我的视图中,但是如何将它保存在控制器中?

不是这样的吧?

params.require(:employee).permit(:name, user_attributes: [:email, :password])

你能给我一些提示或一些有用的链接吗?很难修改设计。谢谢^_^

【问题讨论】:

  • 那么为什么这不起作用?参数哈希看起来如何?你的表格怎么样?
  • 它正在工作,但密码未加密。而且我认为这是一个糟糕的代码。

标签: ruby-on-rails ruby-on-rails-4 devise


【解决方案1】:

Devise 不应该被修改;它只是一系列控制器和一个模型。

如果您想创建一个employee,然后将数据传递给User 模型,那么您采用了正确的方法。

您需要做的是遵守约定(IE 构建 User 模型等)以确保维护 Devise 的功能:


#app/controllers/employees_controller.rb
class EmployeesController < ApplicationController
   def new
      @employee = Employee.new
      @employee.build_user
   end

   def create
      @employee = Employee.new employee_params
      @employee.save
   end

   private

   def employee_params
      params.require(:employee).permit(:name, user_attributes: [:email, :password, :password_confirmation])
   end
end

现在,唯一的问题是 user_attributes 可能是错误的,因为 Devise 以其强大的参数而闻名。

--

要使表单正常工作,您可以使用以下内容:

#app/views/employees/new.html.erb
<%= form_for @employee do |f| %>
   <%= f.text_field :name %>
   <%= f.fields_for :user do |user| %>
      <%= user.email_field :email %>
      <%= user.password_field :password %>
      <%= user.password_field :password_confirmation %>
   <% end %>
   <%= f.submit %>
<% end %>

我没有任何理由(或测试)来反驳这一点。 Devise even suggests,您可以使用 User.new 调用加载表单。因此,我推测您将遇到的主要障碍是强大参数的传递。

【讨论】:

  • 谢谢你。编辑时怎么样?我也可以使用employee_params 吗?我将在哪里声明current_password 字段?因为我试图保存它,但它不起作用。
【解决方案2】:

希望我没有误解,但无需修改设计。 只需传递您需要的所有参数,如果有效,直接创建用户:

params.require(:employee).permit(:name, 
                                 :user_wants_account, 
                                 :whatever, 
                                 :user => [:email, :password, :password_confirmation])

# manually
User.create(:email => params[:employee][:user][:email], 
            :password => params[:employee][:user][:password], 
            :password_confirmation => params[:employee][:user][:password_confirmation],
            :employee_id => self)

如果您想使用“默认”登录表单 - 没问题 - 因为每个用户都有员工关系...

【讨论】:

  • 如何使用build_resource(params[employee][:user][:email], params[employee][:user][:password]),但是如果我的控制器是这样的class EmployeesController &lt; ApplicationController,我将如何使用它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多