Rails 4 - 单击时将布尔值切换为false

时间:2015-06-08 05:30:31

标签: ruby-on-rails

我正在尝试使用Rails 4构建应用程序。

该应用程序有3个模型 - 一个用于Project,一个用于Scope,一个用于Finalize。

Finalize属于范围。范围属于项目。 Project接受Scope(和Finalize)的嵌套属性,Scope接受Finalize的嵌套属性。

在我的终结模型中,我有一个布尔属性:draft。如果草稿为真,那么我想在项目显示页面上包含一个链接,以便在草稿完成时将草稿切换为false。

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 %>

当我尝试这个时,我收到一条错误消息:

未定义的方法`id&#39;为零:NilClass

Gabriel(下面)建议我可能需要通过关联链接(所以@ 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 %>

我收到一条错误消息: 没有路由匹配{:action =&gt;&#34; toggle_draft&#34;,:controller =&gt;&#34; finalizes&#34;,:id =&gt; 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 %>

没有路由匹配{:action =&gt;&#34; toggle_draft&#34;,:controller =&gt;&#34; finalizes&#34;,:id =&gt; 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 %>

没有路线匹配{:action =&gt;&#34; toggle_draft&#34;,:controller =&gt;&#34; finalizes&#34;,:id =&gt;&#34; 53&#34;,: finalise_id =&gt; nil,:method =&gt;:patch}

谢谢

3 个答案:

答案 0 :(得分: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。你必须要小心如何在finalize#toggle_draft方法中获得finalize模型,检查params的命名方式,可能是finalise_id,而不是id。阅读嵌套资源以及如何在控制器之间传递变量会很好。

答案 1 :(得分:1)

这就是最终的工作(使用Margo的指导):

敲定部分:

<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]))

答案 2 :(得分:0)

@finalise_idis not defined... You can gat the id through the relation @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 %>