【问题标题】:how to pass argument from form_for method to controller method in rails?如何将参数从form_for方法传递给rails中的控制器方法?
【发布时间】:2017-03-16 15:35:20
【问题描述】:

我有一个引导模式,当我点击按钮时,这个引导模型将被调用(打开弹出菜单)并传递不同的offer_id

这个弹出菜单打开一个表单(如编辑表单),我编辑了所有信息然后点击编辑按钮然后只更新第一条记录。

例如我想编辑offer_id = 1的信息,当填写所有表格并提交时,offer_id = 1会更新not offer_id = 5强>.

所以我不知道我到底哪里错了,我错过了什么..

在同一页面上编辑按钮和模型 (_employee_details.html.erb)

编辑按钮

<div class="edit-recr-wrp1"> 
       <button type="button" class="btn btn-primary fa fa-pencil-square-o" data-toggle="modal" data-target="#exampleModal1" data-offer_id="<%= emp['offer_letter_id'] %>" data-employee_id="<%= emp['employee_id'] %>"></button>               
</div>

模态“#exampleModal1”

    <div class="modal fade" id="exampleModal1" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel">
  <div class="modal-dialog" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
      </div>
      <div class="modal-body">
        <h2 class="text-center">Edit <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 => "update" } do |f| %>                
                    <div class="col-md-12">

                     <div class="mydata1">
                       <%= f.text_field :offer_letter_id, { class: 'form-control', id: 'offer_id-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>
                        <div class="mydata2">
                          <%= f.text_field :employee_id, { disabled: true, :required => true, placeholder: 'E12345678', class: 'form-control', id: 'employee_id-name' } %>
                        </div>
                        </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, { :required => true, 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, { :required => true,  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: 'datepicker1', 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'], { :required => true }, 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, { :required => true, placeholder: 'Father/Mother/Wife name', class: "form-control" } %>
                        </div>
                      </div> <br>

                      <div class="form-group">
                        <a><%= f.submit "Edit Employee Details", :class => "btn btn-primary" %></a> 
                      </div>
                    </div>
                    <div class="col-md-2"></div>                
                <%- end -%>
            </div>      
        </div>
       </div>
    </div>
  </div>
</div>

<script type="text/javascript">
    // edit employee information
    $('#exampleModal1').on('show.bs.modal', function (event) {
      var button = $(event.relatedTarget)
      var offer_id = button.data('offer_id')
      var employee_id = button.data('employee_id')
      var modal = $(this)
      modal.find('.mydata1 input').val(offer_id)
      modal.find('.mydata2 input').val(employee_id)
    });
</script>

<script type="text/javascript">
    // edit employee information
    $(document).ready(function () {        
        $('#datepicker1').datepicker({
            format: "dd/mm/yyyy"
        });    
    });
</script>

hr_controller.rb

类 HrController

    def new
        @employees = EmployeeDetail.new
    end

    # edit employee information
    def edit
        @employees = EmployeeDetail.find_by(params[:offer_letter_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_by(params[:offer_letter_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

routes.rb

  resources :hr
  get 'hr/edit'
  post 'hr/update'

【问题讨论】:

  • 抱歉,我不清楚。首先,您说您要编辑 order_id 1 并且 order_id 已编辑 - 那么错误是什么?其次,不清楚如何以及何时呈现部分。您是否为订单列表的每个元素呈现部分内容?
  • 我的问题是当我编辑offer_id = 4的信息时,然后更新offer_id = 1的所有信息,而不是offer_id = 4。我编辑offer_id = 4的信息然后应该只更新offer_id =的信息4 不是 offer_id = 1

标签: javascript jquery ruby-on-rails ruby twitter-bootstrap


【解决方案1】:

你应该使用

def update
    @employees = EmployeeDetail.find(params[:employee_details][:offer_letter_id])

如果offer_letter_id 是您的主键或

def update
    @employees = EmployeeDetail.find_by(offer_letter_id: params[:employee_details][:offer_letter_id])

在任何其他情况下......

【讨论】:

  • 我尝试了两种解决方案,但问题仍然没有解决,offer_letter_id 不是主键,所以我尝试了第一个解决方案,然后我发现以下错误:“找不到 'id'=6 的员工详细信息”
  • 我也试过这个:@employees = EmployeeDetail.where("offer_letter_id = ?",params[:employee_details][:offer_letter_id])。然后我收到以下错误:“参数数量错误(1 对 2)”。此行显示错误:“if @employees.update(employee_params)”。
  • 当我尝试这个时:@employees = EmployeeDetail.find_by_offer_letter_id(params[:offer_id])。并从 form_for 方法传递一个值,如下所示: "{:controller => "hr", :action => "update", :offer_id => 2 } do |f| % >”。然后记录: 2 已成功更新,但我想传递此 text_field 值“” 而不是“2”( :offer_id=>2).
【解决方案2】:

您对编辑和更新方法有一些误解。你应该通过 id 找到,我的意思是应该像

@employees = EmployeeDetail.find(id)

其次,请在更新方法中编写一个 raise 来检查是否真的传递数据或仅传递第一个数据,这就是它仅更新您的第一列的原因。 在 def 更新 =>

raise params.inspect

那么你会确定自己的参数是否正确,defemployee_params 方法是否有效?

【讨论】:

  • 当我使用 @employees = EmployeeDetail.find(id) 时出现以下错误。找不到 'id'= 的 EmployeeDetail
  • def update @employees = EmployeeDetail.find(params[:id]) if @employees.update(employee_params) redirect_to :action => 'internal_employee_page'
  • 错误在这里:@employees = EmployeeDetail.find(params[:id])
  • 你能给我一个 raise 输出的快照吗?提高 params.inspect
  • 并给出输出 => raise EmployeeDetail.first.inspect
猜你喜欢
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
  • 2013-05-24
  • 1970-01-01
相关资源
最近更新 更多