【发布时间】:2015-06-16 20:12:27
【问题描述】:
我正在尝试使用 Rails 4 构建应用程序。
该应用有 3 个模型 - 一个用于 Project,一个用于 Scope,一个用于 Finalise。
Finalise 属于范围。范围属于项目。 Project 接受 Scope(和 Finalise)的嵌套属性,Scope 接受 Finalise 的嵌套属性。
在我的定稿模型中,我有一个用于 :draft 的布尔属性。如果草稿为真,那么我想在项目显示页面上包含一个链接,以便在草稿完成时将 :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
在我的 finalizes 控制器中,我有一个方法(由另一个 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
finalize部分节目(已纳入项目节目)有:
<% 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 %>
当我尝试这个时,我收到一条错误消息:
nil:NilClass 的未定义方法 `id'
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=>"toggle_draft", :controller=>"finalises", :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 %>
没有路由匹配 {:action=>"toggle_draft", :controller=>"finalises", :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 %>
没有路线匹配 {:action=>"toggle_draft", :controller=>"finalises", :id=>"53", :finalise_id=>nil, :method=>:patch}
谢谢
【问题讨论】:
-
link_to 使用“GET”,因此您需要指定方法,例如link_to "完成这个草稿", toggle_draft_path(@finalise_id), 方法: :patch
-
感谢 Margo,我在该 link_to 段的末尾添加了 'method: :patch',但我仍然收到一个路由错误消息:没有路由匹配 [GET] "/toggle-draft"
-
如果你运行rake routes,你可能会看到路由被命名为finalise_toggle_draft,所以你需要在partial中使用finalise_toggle_draft_path
-
非常感谢您的帮助。我现在收到此错误:No route matches {:action=>"toggle_draft", :controller=>"finalises", :id=>nil} missing required keys: [:finalise_id]
-
你传过id了吗,finalise_toggle_draft_path(@finalise_id)
标签: ruby-on-rails