2015-06-08 59 views
1

我正在嘗試使用Rails 4來構建應用程序。Rails 4 - 點擊布爾值爲false

該應用程序有3個模型 - 一個用於項目,一個用於範圍,一個用於Finalize。

Finalize屬於範圍。範圍屬於項目。 Project接受Scope(和Finalize)的嵌套屬性,Scope接受Finalize的嵌套屬性。

在我的finalize模型中,我有一個布爾屬性:draft。如果草稿爲真,那麼我希望在草稿完成時在項目展示頁面上包含一個鏈接,以將草稿切換爲假。

SO成員給了我一些在附件中的建議(我試圖遵循,但沒有服務切換布爾屬性)。

在我的項目控制,我有:

def new 
    #authorise @project 
    @project = Project.new 
    @project.scope = Scope.new 
    @project.scope.finalise = Finalise.new 

    end 

在我的控制範圍,我有;

def new 
    @scope = Scope.new 
    @scope.finalises.build 
    end 

以我定型控制器,我的方法(這是由另一SO用戶建議):

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

最終化路線具有:

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

的完成部分節目(其中包含在項目展示中)具有:

<% if @project.scope.finalise.draft == true %> 
      <div class="finalise"> <%= link_to 'Finalise this draft', 
finalise_toggle_draft_path(:id => @finalise.id), :remote => true, method: :patch %></div> 

    <% end %> 

當我嘗試這個,我得到一個錯誤,指出:

未定義的方法'身份證」的零:NilClass

加布裏埃爾(下)曾建議,我可能需要通過協會(所以@project鏈接。 scope.finalise.id)。我已經嘗試過這個公式和@project.scope.finalise_id。這兩者都不管用。

當我嘗試,因爲:

<% if @project.scope.finalise.draft == true %> 
    <div class="finalise"> <%= link_to 'Finalise this draft', 
             finalise_toggle_draft_path(:id => @project.scope.finalise.id), :remote => true, method: :patch %></div> 

<% end %> 

我得到一個錯誤,指出: 沒有路由匹配{:動作=> 「toggle_draft」:控制器=> 「定型」,:ID => 1 }缺少必需的鍵:[:finalise_id]

當我嘗試:

我得到一個錯誤,指出:

<% if @project.scope.finalise.draft == true %> 
    <div class="finalise"> <%= link_to 'Finalise this draft', 
             finalise_toggle_draft_path(:id => @project.scope.finalise.id), :action => 'toggle-draft', :remote => true, method: :patch %></div> 

<% end %> 

沒有路由匹配{:動作=> 「toggle_draft」:控制器=> 「定型」,:ID => 1}缺少必需的鍵:[:finalise_id]

當我嘗試:

我得到這個錯誤:

<% if @project.scope.finalise.draft == true %> 
    <div class="finalise"> <%= link_to 'Finalise this draft', 
             controller: "finalises", action: "toggle_draft", 
             finalise_id: @finalise_id, 
             :remote => true, 
             method: :patch %> 
    </div> 

<% end %> 

沒有路由匹配{:行動=> 「toggle_draft」:控制器=> 「定型」,:ID => 「53」,:finalise_id =>零,:方法=>:補丁}

謝謝

+0

的link_to使用 'GET',所以你需要例如指定方法link_to「完成此草稿」,toggle_draft_path(@finalise_id),方法:: patch – margo

+0

感謝Margo,我在link_to段的末尾添加了'method::patch',但是我仍然收到一個路由錯誤:沒有路由匹配[GET]「/ toggle-draft」 – Mel

+0

如果您運行耙路線,您可能會看到該路線名爲finalise_toggle_draft,因此您需要在部分 – margo

回答

1

在projects_controller

def show 
    @project = Project.find(params[:id]) 
end 
在項目

顯示視圖

<%= link_to 'Finalise draft', finalise_toggle_draft_path(@project.scope.finalise.id), method: :patch 

您應該能夠使用命名的路線並傳遞您可以從@project獲得的finalize id。你必須小心如何在#toggle_draft方法的finalizes中得到finalize模型,檢查你的params是如何命名的,可能是finalise_id,而不是id。閱讀嵌套資源以及如何在控制器之間傳遞變量是一件好事。

+0

嗨馬戈,我已經嘗試了id作爲'@project.scope.finalise.id'和'@project.scope.finalise_id',但在這兩種情況下,我得到一個錯誤,說:無法找到最終確定沒有ID – Mel

0

@finalise_id沒有定義...您可以通過關係上山寨的id@project.scope.finalise.id

<% if @project.scope.finalise.draft == true %> 
    <div class="finalise"> <%= link_to 'Finalise this draft', finalise_toggle_draft_path(id: @project.scope.finalise.id), method: :patch %></div> 
<% end %> 
+0

嗨加布裏埃爾,我試過這個,但它沒有奏效。無論如何,謝謝 – Mel

1

這是結束了工作(使用馬戈的指導):

定型部分:

<div class="finalise"> 
    <%= link_to 'Finalise draft', finalise_toggle_draft_path(projectid: @project.id, id: @project.scope.finalise.id, finalise_id: @project.scope.finalise.id), method: :patch %> 
</div> 

Finalises_controller

def toggle_draft 
    @finalise = Finalise.find(params[:id]) 
    @finalise.draft = false 
    @finalise.finalised = Time.now 
    @finalise.save 
    redirect_to project_path(Project.find(params[:projectid])) 
+0

這很棒,你得到它的工作。我沒有給你整個解決方案,因爲當你弄清楚如何調試和解決問題時,你將能夠更快地解決未來的問題。在部分,你可以做link_to「Finalize草稿」,finalise_toggle_draft_path(@project.scope.finalise.id)。然後在toggle_draft方法中@finalise = Finalise.find(params [:finalise_id])。在控制檯中運行rake路由,您會看到作爲路由一部分的預期參數。由於您需要將項目實例重定向到,因此將它傳遞給params數組是正確的。 – margo

+0

祝您的項目順利! – margo

+0

非常感謝Margo。我非常感謝幫助 – Mel