2015-06-07 104 views
0

我想弄清楚如何在我的Rails 4應用程序中將布爾屬性從true切換到false。我在早期版本的rails中讀過很多類似的問題,但是路由和其他東西已經改變,使得這些解決方案與我需要的不同。切換布爾在Rails 4

我有一個項目模型,其中包括一個名爲草稿的屬性。如果:draft是錯誤的,我想在我的節目中加入一個鏈接,使草稿更新爲true。

我已經嘗試了其他答案的幾個JS解決方案,但我無法弄清楚我需要這個邏輯。

有沒有人在Rails 4中做過這件事?

我在下面試圖卓然的建議如下:

項目控制器:

def toggle_draft 
    @project = Project.find(params[:id]) 
    @project.draft = true 
    @project.save 
    redirect_to project_path(@project) 
    end 

項目顯示:

<% if @project.scope.finalise.draft %> 
     <%= link_to toggle_draft_path(id: @scope.id) 
    <% end %> 

路線:

resources :finalise 

    patch '/toggle-draft', to 'finalises#toggle_draft', as: 'toggle_draft' 

我已經更新了我的小號chema創建一個名爲範圍的模型和一個名爲finalize的模型。範圍屬於項目,Finalize屬於範圍。

我已將Scope設置爲接受Finalize和Projects的嵌套屬性,以接受Scope的嵌套屬性。我在項目和範圍上標註了白色的參數,並最終確定。

我現在在Finalize視圖中有兩個部分,一個用於草稿,另一個用於完成。在草案局部我曾嘗試:

<% if @project.scope.draft == true %> 
    <%= link_to toggle_draft_path(id: @project.scope.id) %> 
<% end %> 

以我最終化控制器,I具有肘節方法,用於從卓然提示:

def toggle_draft 
    @finalise = Finalise.find(params[:id]) 
    @finalise.draft = true 
    @finalise.save 
    redirect_to project_path(@project) 
    end 

上述和我的航線:

resources :finalises 
    patch '/toggle-draft', to 'finalises#toggle_draft', as: 'toggle_draft' 

我試着啓動服務器來測試這個,但是我得到一個錯誤,說:

rb:4:語法錯誤,u如下所示:期望keyword_do或'{'或'('(SyntaxError) patch'/ toggle-draft',以'finalizes#toggle_draft',如:...

當我評論路線時,並嘗試啓動服務器,我得到一個進一步的錯誤,說:

PG :: UndefinedColumn:錯誤:列finalises.scope_id不存在 行1:SELECT「finalizes」。* FROM「finalizes」WHERE「finalizes 「。」s ...

我的定稿表有一個scopes_id(整數)列。

謝謝

+0

顯示你已經嘗試過的一些代碼,我們將從那裏獲得幫助。 – jvnill

+0

我在上面提出了Zoran的建議 – Mel

+0

要解決'PG:UndefinedColumn'錯誤,您必須在'finalises'表中添加'scope_id'列,並運行必要的遷移。 – Zoran

回答

1

你可以不喜歡下面的完成撥動草案爲您的項目:

  1. 暴露你的節目頁面上的鏈接路徑:

routes.rb:

patch '/toggle-draft', to: 'projects#toggle_draft', as: 'toggle_draft' 
  • 在ProjectsController定義toggle_draft
  • projects_controller.rb

    def toggle_draft 
        @project = Project.find(params[:id]) 
        @project.draft = true 
        @project.save 
        redirect_to project_path(@project) 
    end 
    
  • 最後,在標記您可以有條件地顯示鏈接:
  • projects/show.html.erb:

    <% if @project.draft %> 
        <%= link_to 'Toggle', toggle_draft_path(id: @project.id), method: :patch %> 
    <% end %> 
    

    希望這對我很有幫助。

    +1

    由於這是一種破壞性行爲,我寧願在'POST'中這樣做。或更多RESTfully - 'PATCH'。通過使用'GET',人們可以通過緩存獲得一些特殊效果。 –

    +0

    嗨卓然,我想這一點,但獲得與路線=>期待keyword_do或「{」或「(」 GET「/撥動草案」,以「項目#toggle_draft」,爲錯誤: – Mel

    +0

    我的錯 - 我忘了在** routes.rb **文件中包含一個':',我更新了我的答案,再次看一下routes.rb中的行,它應該修復這個錯誤,希望它有幫助! – Zoran