我正在铁轨中构建一个Todo列表,试图了解它是如何工作的。我从另一个控制器的视图中调用控制器的action
时遇到了问题。
我有TodoList
has_many TodoItem
和TodoItem
belongs_to TodoList
。
TodoList的#模型
has_many :todo_items
def has_completed_items?
todo_items.complete.size > 0
end
def has_incompleted_items?
todo_items.incomplete.size > 0
end
的TodoItem#模型
belongs_to :todo_list
scope :complete, -> { where("completed_at is not null") }
scope :incomplete, -> { where(completed_at: nil) }
def completed?
!completed_at.blank?
end
路线
resources :todo_lists do
resources :todo_items do
member do
patch :complete
end
end
end
修补程序生成此路线:
complete_todo_list_todo_item PATCH
/todo_lists/:todo_list_id/todo_items/:id/complete(.:format)
todo_items#complete
现在,我可以从我的TodoItem
视图中调用此路径,而不会出现这样的问题:<%= link_to "Mark", complete_todo_list_todo_item_path(todo_item), method: :patch %>
将完整/不完整scope
添加到我的TodoItem
后,我将以下内容添加到我的TodoList节目视图中:
TodoList的#显示
<% @todo_list.has_incompleted_items? %>
<% @todo_list.todo_items.incomplete.each do |item| %>
<li><%= item.content %></li>
<% end %>
这是正确显示不完整的项目,因此我尝试在此视图中添加一个标记项目的链接,如下所示:
<% @todo_list.has_incompleted_items? %>
<% @todo_list.todo_items.incomplete.each do |item| %>
<li><%= item.content %>
<%= link_to "Mark", complete_todo_list_todo_item_path(item), method: :patch %></li>
<% end %>
现在我收到以下错误:
TodoLists中的NoMethodError#显示未定义的方法 `#&lt;#:0x000001071cf540&gt;的
complete#action
?感谢您的帮助。
答案 0 :(得分:0)
我能够通过从路径文件中删除member
块来解决此问题:
resources :todo_lists do
resources :todo_items do
patch :complete
end
end
现在我的行动路线已更新为:todo_list_todo_item_complete
所以从我看来,我不得不用它的嵌套资源调用新路径:
link_to "Mark", todo_list_todo_item_complete_path(@todo_list, item), method: :patch
最后,我必须更新我的控制器,以在完整的块中找到正确的todo_item #id:
@todo_item = @todo_list.todo_items.find(params[:todo_item_id])