2017-02-15 62 views
0

我有一個名爲:active的布爾字段,可通過Ajax進行更改。我有它的工作,取消選中框,從而使布爾假,或者,在數據庫中,它刪除該屬性使其爲空,但仍然工作。複選框不使用Ajax

我的問題是它不能正常工作。我可以檢查框以使布爾值爲TRUE,看起來它正在做某事,但它實際上並未在數據庫中做出更改。

在Webbrick的輸出顯示它更新:

Processing by CompaniesController#toggle as JS 
Parameters: {"Active"=>"228", "id"=>"228"} 
SQL (0.5ms) UPDATE "companies" SET "active" = $1, "updated_at" = $2 
      WHERE "companies"."id" = $3 [["active", nil], 
      ["updated_at", 2017-02-15 17:26:19 UTC], ["id", 228]] 
(0.8ms)  COMMIT 

但數據庫沒有更新。我看到上面說的[[「active, nil],這是不正確的部分。所以從技術上說,更新正在工作,但我很確定我的控制器是爲什麼它要發送nil重新檢查。

那麼,如何在我的控制器中發送布爾值TRUE,如果這確實是我應該這樣做的地方。

companies_controller.rb

def toggle 
    @company = Company.find(params[:id]) 
    if @company.update_attributes(active: params[:active]) 
    # todo: maybe give a notice 
    else 
    # todo: maybe give a notice 
    end 
end 

index.html.rb

<%= check_box_tag 'Active', company.id, company.active, 
     data: { 
     remote: true, 
     url: url_for(action: :toggle, id: company.id), 
     method: "POST" 
     } %> 

的routes.rb

resources :companies do 
    resources :comments 
    member do 
    post 'toggle' 
    end 
end 

編輯

我把它改變我的控制器if語句使用工作。不知道這是否是最好的方法,但它現在可以在兩個方向上工作。

companies_controller.rb

def toggle 
    @company = Company.find(params[:id]) 
    if @company.active 
    @company.update_attributes(active: FALSE) 
    else 
    @company.update_attributes(active: TRUE) 
    end 
end 
+0

如果您只是想修復您現有的代碼,而不是錯誤的是您使用'company.id'作爲複選框的值 - 而不是布爾列。 – max

+0

我最終看到'(active:params [:active])'給出'id'而不是布爾值。你的回答(下面)增加了jQuery,但是消除了路由的混亂。我也會嘗試這種方式。 – Reveren

+0

如果您使用的是rails_ujs,則您已將jQuery作爲依賴項。 – max

回答

-1

你並不真的需要一個單獨的路徑。相反,你可以只發送PATCH請求到現有的路線:

<% form_for(@company) do |f| %> 
    <%= f.check_box :active, class: "company-toggle-active" %> 
<% end %> 

確保控制器處理JSON:

class CompaniesController < ApplicationController 
    # ... 
    def update 
    @company = Company.find(params[:id]) 

    if @company.update(company_attributes) 
     respond_to do |f| 
     f.json { head :ok } 
     f.html { redirect_to @company } 
     end 
    else 
     respond_to do |f| 
     f.json { json: { errors: @company.errors }, status: 422 } 
     f.html { render :new } 
     end 
    end 
    end 

    private 
    def company_attributes 
    params.require(:company).permit(:foo, :bar, :active) 
    end 
end 

然後,我們可以設置爲改變事件的處理程序的更新使用Ajax:

$(document).on('change', '.company-toggle-active', function(){ 
    $.ajax({ 
    url: this.form.action, 
    type: 'PATCH', 
    dataType: 'json', 
    data: { 
     company: { 
     active: $(this).is(':checked') ? 'true' : 'false' 
     } 
    } 
    }).done(function(data, textStatus, jqXHR){ 
    // do something if request is successful 
    }).fail(function(data, textStatus, jqXHR){ 
    // do something if request fails 
    }); 
});