【问题标题】:undefined method `gsub' for nil:NilClass or how to use gsub method in railsnil:NilClass 的未定义方法“gsub”或如何在 rails 中使用 gsub 方法
【发布时间】:2016-10-24 07:31:25
【问题描述】:

我想连续生成一个Employee_ID,我已经在数据库表中修复了一个初始员工ID。格式是“E36162000”,我从表中取出最后一个员工 ID,然后只提取整数值然后加一个,这将是下一个 employee id

但是在这个gsub()方法不起作用,gsub方法提取整数是完美的,链接Next 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

我的布局视图

**此行错误**

&lt;% emp_id_sub = emp_id.gsub(/[^\d]/, '') %&gt;

错误是

当我点击提交按钮时会生成错误,但数据保存在 employee_details 表中,除了 Employee_Id

【问题讨论】:

    标签: mysql ruby-on-rails ruby ruby-on-rails-3


    【解决方案1】:

    您可能没有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" 
    

    【讨论】:

    • 谁说我是空的,我用我的代码试了一下,然后才贴出我的答案。
    • 我应该将我的查询粘贴到问题中吗?
    • @mudasobwa,请在我的回答中使用 select 检查示例查询。
    • 没问题,您是资深先生,我们会尊重您的建议,请在您否决之前检查或告知一次。无论如何,先生。 :)
    【解决方案2】:

    我们也可以在模型中创建一个方法,我们可以调用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
    

    结束

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多