我正在尝试使用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}
谢谢
答案 0 :(得分:1)
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_id
is 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 %>