【发布时间】:2019-09-17 08:34:16
【问题描述】:
1.描述核心问题
我正在实施devices_invitable gem 来邀请用户。 gem 已正确添加,因为我可以向用户发送标准 devices_invitable 电子邮件以邀请他们使用该应用程序。
我遇到的问题是,我不确定如何让管理员(用枚举标识)分配他们邀请的用户的角色(例如,他们应该输入电子邮件和角色他们邀请的用户,然后应该正确添加到我的数据库中)。
注意: 正如您在下面看到的,我目前正在尝试使用带有 cocoon gem 的嵌套表单来解决它,但我对其他方法持开放态度。
2。我目前的申请
应用程序有 2 个表,它们之间存在多对多关系:
(i) 用户,其角色属性由枚举定义。
(ii) 公园
这个想法是让管理员通过输入电子邮件+角色来邀请新用户进入公园(而不是整个应用程序)。
3.代码
user.rb
class User < ApplicationRecord
has_many :user_parks, dependent: :destroy
has_many :parks, :through => :user_parks
enum role: [:owner, :admin, :employee, :accountant]
after_initialize :set_default_role, :if => :new_record?
def set_default_role
self.role ||= :admin
end
devise :invitable, :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable, :invitable
end
park.rb
class Park < ApplicationRecord
has_many :user_parks, dependent: :destroy
has_many :users, :through => :user_parks
accepts_nested_attributes_for :users, allow_destroy: true, reject_if: ->(attrs) { attrs['email'].blank? || attrs['role'].blank?}
end
parks_controller.rb
class ParksController < ApplicationController
def update
@park = Park.find(params[:id])
authorize @park
url = Rails.application.routes.recognize_path(request.referrer)
last_action = url[:action]
if last_action == 'edit_users' & @park.user.last.nil?
@user=@park.user.last.invite!(email: park_params[:user][:email])
end
@park = @park.update_attributes(park_params)
redirect_to parks_path
end
def edit_users
@park = Park.find(params[:id])
authorize @park
end
private
def park_params
params.require(:park).permit(:name, users_attributes: [:email, :role, :_destroy])
end
end
edit_users.html.erb
<%= render 'users_edit_form', park: @park%>
_users_edit_form
<%= simple_form_for [@park] do |f|%>
<h1>Park</h1>
<% @park.users.each do |user| %>
<%= user.email %>
<% end %>
<div>
<% f.simple_fields_for User.new, :url=> new_user_invitation_path, html: { class: 'form-inline' } do |user| %>
<%= user.input :email %>
<%= user.input :role, priority: [:employee], collection:[:owner, :admin, :employee, :accountant] %>
<%= f.button :submit, 'Invite User', class: 'btn-primary' %>
<% end %>
</div>
#TEST for standard view (sends invite but does not assign park/role)
<%# link_to "new user add", new_user_invitation_path %>
<%= f.button :submit, 'Invite User', class: 'btn-primary' %>
<% end %>
【问题讨论】:
标签: ruby-on-rails devise rails-activerecord devise-invitable