Rails 4 : Table 布尔列更新始终使用 "link_to " 和特定值 "TRUE"

Rails 4 : Table Boolean Column Update Using "link_to "with a specific value "TRUE" always

在我的客户控制器中,更新方法代码如下所示:

  def update
    @customer= Customer.find(params[:id])
    if @customer.update_attributes(customer_params)
      redirect_to  customers_path
    else
      render 'edit'
    end
  end

在我看来,在客户索引页面中,我计划添加一个 "link_to" link,如果单击它,则该特定客户字段 "doc_delete" 应该更新为值 "TRUE".

<td><%= link_to "[Update", *************what is here ?******** method: :put %></td>

您需要一个表格来为您做这件事

<% unless customer.doc_delete? %>
  <%= form_for customer do |f| %>
    <%= f.hidden_field_tag :doc_delete, true %>
    <%= f.submit %>
  <% end %>
<% end %>

在哪里插入这个表格?

好吧,如果您使用以下方式呈现您的客户:

   <%=render @costumers %>

然后您将在 /customers/_customer.html.erb

中添加表格

如果您手动循环:

<% @customers.each do |customer| %>
  <%=customer.full_name %>
  ## Here you can add the form
<% end %>

你可以通过button_to传递隐藏参数:

<%= button_to "Update", user, method: :put, params: { doc_delete: true } %>

这将创建一个 micro-form,就像 Marwen 提到的那样。虽然效率很低,但这将是向您的 update 操作发送数据的最佳方式。

--

另一种更有效的方法是定义自定义 route/action:

#config/routes.rb
resources :customers do
   patch :doc_delete, on: :member #-> url.com/users/:id/doc_delete
end

#app/controllers/customers_controller.rb
class CustomersController < ApplicationController
   def doc_delete
      @customer = Customer.find params[:id]
      redirect_to customers_path if @customer.update doc_delete: true
   end
end

#app/views/customers/index.html.erb
<% @customers.each do |customer| %>
   <%= link_to "Update", customer_doc_delete_path(customer) %>
<% end %>

另一种方式,你可以使用Ajax.

#app/views/customers/index.html.erb
<% @customers.each do |customer| %>
   <% if !customer.doc_delete == true %>
     <%= link_to "Update", customer_doc_delete_path(customer), remote: true %>
   <% else %>
     <%= Updated %>
   <% end %>
<% end %>

#config/routes.rb
resources :customers do
   patch :doc_delete, on: :member #-> url.com/customers/:id/doc_delete
end

#app/controllers/customers_controller.rb
class CustomersController < ApplicationController
   def doc_delete
      @customer = Customer.find params[:id]

      if @customer.update doc_delete: true
        respond_to do | format |  
          format.js {render :nothing => true} 
        end 
      end
   end
end

在我的index.html

      <td>
        <%= hidden_field_tag 'delete_present', :value => "present" %>
        <%=link_to "[update]", customer_path(customer, :doc_delete => true), :method => :put, :confirm => "Are you sure?" %>
      </td>

在我的客户控制器中

def update
      if params[:doc_delete].present?
        @customer= Customer.find(params[:id])
        @customer.doc_delete=true
        @customer.save
        redirect_to  customers_path
      else  
        @customer= Customer.find(params[:id])
        if @customer.update_attributes(customer_params)
          redirect_to  customers_path
        else
          render 'edit'
        end
      end
  end