nil:NilClass 的未定义方法 `gsub' 或如何在 rails 中使用 gsub 方法
undefined method `gsub' for nil:NilClass or how to use gsub method in rails
我想连续生成一个 Employee_ID
,我已经在数据库 table 中修复了一个初始员工 ID。格式是“E36162000”,我从 table 中获取最后一个员工 ID,然后只提取整数值然后加一,这将是下一个 employee id
.
但是在这个gsub()方法中不起作用,gsub方法提取整数是完美的,link 下一步Employee_id = E36162001
但是当我提交时,错误就来了。我正在发送代码和屏幕排序请帮助我
_employee_details.html.erb - 这是我的观点
<div class="modal-body">
<h2 class="text-center">Add <span>Employee Details</span></h2>
<div class="post-new-job head-border">
<div class="alert alert-success" role="alert" id='success-job' style='display:none;'>Employee Details is successfully added.</div>
<div class="form-body">
<%= form_for(:employee_details, :url => {:controller => 'hr', :action => 'create'}) do |f| %>
<div class="col-md-12">
<!--auto generate emp id-->
<% @last_emp_id = EmployeeDetail.select("employee_id").last %>
<% emp_id = @last_emp_id.employee_id %>
<% emp_id_sub = emp_id.gsub(/[^\d]/, '') %>
<% auto_generate_id = 'E'.to_s + (emp_id_sub.to_i + 1).to_s %>
<h1> Employee ID : <%= auto_generate_id %> </h1>
<div class="mydata">
<%= f.hidden_field :offer_letter_id, { class: 'form-control', id: 'recipient-name' } %>
</div>
<div class="form-group">
<label class="control-label">Employee ID</label>
<div class="input-group"> <span class="input-group-addon"> <i class="fa fa-user"></i> </span>
<%= f.text_field :employee_id, { :value => auto_generate_id, :disabled=>true , :required => true, placeholder: 'E12345678', class: 'form-control' } %>
</div>
</div>
<div class="form-group">
<label class="control-label">Bank Account</label>
<div class="input-group"> <span class="input-group-addon"> <i class="fa fa-university"></i> </span>
<%= f.text_field :bank_ac, {placeholder: '06464060852634865', class: 'form-control' } %>
</div>
</div>
<div class="form-group">
<label class="control-label">Bank IFSC Code</label>
<div class="input-group"> <span class="input-group-addon"> <i class="fa fa-code"></i> </span>
<%= f.text_field :bank_ifsc, {placeholder: 'SBI012356', class: 'form-control' } %>
</div>
</div>
<div class="form-group">
<label class="control-label">End of Date</label>
<div class="input-group"> <span class="input-group-addon"> <i class="fa fa-calendar"></i> </span>
<%= f.text_field :work_end_date, { placeholder: 'MM/DD/YYYY', id: 'datepicker', class:"datepicker_style" } %>
</div>
</div>
<div class="form-group">
<label class="control-label">Gender</label>
<div class="input-group"> <span class="input-group-addon"> <i class="fa fa-male fa-female"></i> </span>
<%= f.select :gender, ['Male', 'Female'], { }, class: "form-control" %>
</div>
</div>
<div class="form-group">
<label class="control-label">Spouse Name</label>
<div class="input-group"> <span class="input-group-addon"> <i class="fa fa-user"></i> </span>
<%= f.text_field :spouse_name, { placeholder: 'Father/Mother/Wife name', class: "form-control" } %>
</div>
</div> <br>
<div class="form-group">
<a><%= f.submit "Add Employee Details", :class => "btn btn-primary" %></a>
</div>
</div>
<div class="col-md-2"></div>
<%- end -%>
</div>
</div>
</div>
employee_details.rb - 这是我的模型
class EmployeeDetail < ActiveRecord::Base
belongs_to :user
validates :offer_letter_id, presence: true
end
hr_controller.rb - 这是我的控制器
class HrController < ApplicationController
def new
@employees = EmployeeDetail.new
end
# edit employee information
def edit
@employees = EmployeeDetail.find(params[:id])
end
def create
@employees = EmployeeDetail.new(employee_params)
if @employees.save
redirect_to :action => 'internal_employee_page'
else
redirect_to :action => 'internal_employee_page'
end
end
def show
@employees = EmployeeDetail.find(params[:id])
end
def update
@employees = EmployeeDetail.find(params[:id])
if @employees.update(employee_params)
redirect_to :action => 'internal_employee_page'
else
redirect_to :action => 'internal_employee_page'
end
end
private
def employee_params
params.require(:employee_details).permit(:offer_letter_id, :employee_id, :bank_ac, :bank_ifsc, :spouse_name, :gender, :work_end_date)
end
end
我的布局视图
**这一行有错误**
<% emp_id_sub = emp_id.gsub(/[^\d]/, '') %>
错误是
当我点击提交按钮时会产生错误,但数据保存在 employee_details table 除了 Employee_Id
您可能没有emp_id
。尝试将代码更改为,
<% @last_emp_id = EmployeeDetail.select("employee_id").last %>
<% emp_id = @last_emp_id.employee_id %>
<% emp_id_sub = emp_id.present? ? emp_id.gsub(/[^\d]/, '') : ''%>
<% auto_generate_id = emp_id_sub.length > 0 ? ? ('E'.to_s + (emp_id_sub.to_i + 1).to_s) : "" %>
<h1> Employee ID : <%= auto_generate_id %> </h1>
检查 emp_id
是否存在,然后 emp_id_sub
更新:根据 @mudasobwa
的评论使用 select 添加了示例查询
2.3.1 :015 > @user = User.select("email").last
User Load (0.5ms) SELECT `users`.`email` FROM `users` ORDER BY `users`.`id` DESC LIMIT 1
=> #<User id: nil, email: "test@ead.com">
2.3.1 :016 > email = @user.email
=> "test@ead.com"
我们还可以在模型中创建一个方法,我们可以调用 before_save,无论何时创建新的员工详细信息,然后在保存之前执行并将员工 ID 存储到数据库中
class EmployeeDetail < ActiveRecord::Base
belongs_to :user
validates :offer_letter_id, presence: true
# auto generate employee id
before_save :Auto_generate_emp_id
def Auto_generate_emp_id
@last_emp_id = EmployeeDetail.order("employee_id").last
emp_id = @last_emp_id.employee_id
emp_id_sub = emp_id.gsub(/[^\d]/, '')
auto_generate_id = 'E'.to_s + (emp_id_sub.to_i + 1).to_s
self.employee_id = auto_generate_id
end
结束
我想连续生成一个 Employee_ID
,我已经在数据库 table 中修复了一个初始员工 ID。格式是“E36162000”,我从 table 中获取最后一个员工 ID,然后只提取整数值然后加一,这将是下一个 employee id
.
但是在这个gsub()方法中不起作用,gsub方法提取整数是完美的,link 下一步Employee_id = E36162001
但是当我提交时,错误就来了。我正在发送代码和屏幕排序请帮助我
_employee_details.html.erb - 这是我的观点
<div class="modal-body">
<h2 class="text-center">Add <span>Employee Details</span></h2>
<div class="post-new-job head-border">
<div class="alert alert-success" role="alert" id='success-job' style='display:none;'>Employee Details is successfully added.</div>
<div class="form-body">
<%= form_for(:employee_details, :url => {:controller => 'hr', :action => 'create'}) do |f| %>
<div class="col-md-12">
<!--auto generate emp id-->
<% @last_emp_id = EmployeeDetail.select("employee_id").last %>
<% emp_id = @last_emp_id.employee_id %>
<% emp_id_sub = emp_id.gsub(/[^\d]/, '') %>
<% auto_generate_id = 'E'.to_s + (emp_id_sub.to_i + 1).to_s %>
<h1> Employee ID : <%= auto_generate_id %> </h1>
<div class="mydata">
<%= f.hidden_field :offer_letter_id, { class: 'form-control', id: 'recipient-name' } %>
</div>
<div class="form-group">
<label class="control-label">Employee ID</label>
<div class="input-group"> <span class="input-group-addon"> <i class="fa fa-user"></i> </span>
<%= f.text_field :employee_id, { :value => auto_generate_id, :disabled=>true , :required => true, placeholder: 'E12345678', class: 'form-control' } %>
</div>
</div>
<div class="form-group">
<label class="control-label">Bank Account</label>
<div class="input-group"> <span class="input-group-addon"> <i class="fa fa-university"></i> </span>
<%= f.text_field :bank_ac, {placeholder: '06464060852634865', class: 'form-control' } %>
</div>
</div>
<div class="form-group">
<label class="control-label">Bank IFSC Code</label>
<div class="input-group"> <span class="input-group-addon"> <i class="fa fa-code"></i> </span>
<%= f.text_field :bank_ifsc, {placeholder: 'SBI012356', class: 'form-control' } %>
</div>
</div>
<div class="form-group">
<label class="control-label">End of Date</label>
<div class="input-group"> <span class="input-group-addon"> <i class="fa fa-calendar"></i> </span>
<%= f.text_field :work_end_date, { placeholder: 'MM/DD/YYYY', id: 'datepicker', class:"datepicker_style" } %>
</div>
</div>
<div class="form-group">
<label class="control-label">Gender</label>
<div class="input-group"> <span class="input-group-addon"> <i class="fa fa-male fa-female"></i> </span>
<%= f.select :gender, ['Male', 'Female'], { }, class: "form-control" %>
</div>
</div>
<div class="form-group">
<label class="control-label">Spouse Name</label>
<div class="input-group"> <span class="input-group-addon"> <i class="fa fa-user"></i> </span>
<%= f.text_field :spouse_name, { placeholder: 'Father/Mother/Wife name', class: "form-control" } %>
</div>
</div> <br>
<div class="form-group">
<a><%= f.submit "Add Employee Details", :class => "btn btn-primary" %></a>
</div>
</div>
<div class="col-md-2"></div>
<%- end -%>
</div>
</div>
</div>
employee_details.rb - 这是我的模型
class EmployeeDetail < ActiveRecord::Base
belongs_to :user
validates :offer_letter_id, presence: true
end
hr_controller.rb - 这是我的控制器
class HrController < ApplicationController
def new
@employees = EmployeeDetail.new
end
# edit employee information
def edit
@employees = EmployeeDetail.find(params[:id])
end
def create
@employees = EmployeeDetail.new(employee_params)
if @employees.save
redirect_to :action => 'internal_employee_page'
else
redirect_to :action => 'internal_employee_page'
end
end
def show
@employees = EmployeeDetail.find(params[:id])
end
def update
@employees = EmployeeDetail.find(params[:id])
if @employees.update(employee_params)
redirect_to :action => 'internal_employee_page'
else
redirect_to :action => 'internal_employee_page'
end
end
private
def employee_params
params.require(:employee_details).permit(:offer_letter_id, :employee_id, :bank_ac, :bank_ifsc, :spouse_name, :gender, :work_end_date)
end
end
我的布局视图
**这一行有错误**
<% emp_id_sub = emp_id.gsub(/[^\d]/, '') %>
错误是
当我点击提交按钮时会产生错误,但数据保存在 employee_details table 除了 Employee_Id
您可能没有emp_id
。尝试将代码更改为,
<% @last_emp_id = EmployeeDetail.select("employee_id").last %>
<% emp_id = @last_emp_id.employee_id %>
<% emp_id_sub = emp_id.present? ? emp_id.gsub(/[^\d]/, '') : ''%>
<% auto_generate_id = emp_id_sub.length > 0 ? ? ('E'.to_s + (emp_id_sub.to_i + 1).to_s) : "" %>
<h1> Employee ID : <%= auto_generate_id %> </h1>
检查 emp_id
是否存在,然后 emp_id_sub
更新:根据 @mudasobwa
的评论使用 select 添加了示例查询2.3.1 :015 > @user = User.select("email").last
User Load (0.5ms) SELECT `users`.`email` FROM `users` ORDER BY `users`.`id` DESC LIMIT 1
=> #<User id: nil, email: "test@ead.com">
2.3.1 :016 > email = @user.email
=> "test@ead.com"
我们还可以在模型中创建一个方法,我们可以调用 before_save,无论何时创建新的员工详细信息,然后在保存之前执行并将员工 ID 存储到数据库中
class EmployeeDetail < ActiveRecord::Base
belongs_to :user
validates :offer_letter_id, presence: true
# auto generate employee id
before_save :Auto_generate_emp_id
def Auto_generate_emp_id
@last_emp_id = EmployeeDetail.order("employee_id").last
emp_id = @last_emp_id.employee_id
emp_id_sub = emp_id.gsub(/[^\d]/, '')
auto_generate_id = 'E'.to_s + (emp_id_sub.to_i + 1).to_s
self.employee_id = auto_generate_id
end
结束