Ruby Rails 4:控制器之间的路由和共享操作?什么';什么是正确的惯例?
我正在rails中建立一个待办事项列表,试图了解它是如何工作的。我在从另一个控制器的视图调用控制器的Ruby Rails 4:控制器之间的路由和共享操作?什么';什么是正确的惯例?,ruby,ruby-on-rails-4,Ruby,Ruby On Rails 4,我正在rails中建立一个待办事项列表,试图了解它是如何工作的。我在从另一个控制器的视图调用控制器的操作时遇到问题 我有一个TodoList有许多TodoItem和TodoItem属于TodoList 托多利斯特#模式 has_many :todo_items def has_completed_items? todo_items.complete.size > 0 end def has_incompleted_items? todo_items.incomplete.siz
操作时遇到问题
我有一个TodoList
有许多TodoItem
和TodoItem
属于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
belongs_to :todo_list
scope :complete, -> { where("completed_at is not null") }
scope :incomplete, -> { where(completed_at: nil) }
def completed?
!completed_at.blank?
end
TodoItem#Model
has_many :todo_items
def has_completed_items?
todo_items.complete.size > 0
end
def has_incompleted_items?
todo_items.incomplete.size > 0
end
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
现在,我可以从我的到doItem
视图调用此路径,而不会出现这样的问题:
将完整/不完整的范围
添加到我的TodoItem
后,我将以下内容添加到我的TodoList show视图中:
TodoList#Show
<% @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中的命名错误显示未定义的方法
`完成的\u待办事项\u列表\u待办事项\u项目\u路径'#
为什么在我的TodoList#show视图中未定义此complete#操作
控制器之间共享操作的适当约定是什么
谢谢您的帮助。我可以通过从路由文件中删除成员
块来解决此问题:
resources :todo_lists do
resources :todo_items do
patch :complete
end
end
现在,我的行动路线已更新为:todo\u list\u todo\u item\u complete
因此,在我看来,我必须使用嵌套资源调用新路由:
link_to "Mark", todo_list_todo_item_complete_path(@todo_list, item), method: :patch
最后,我必须更新控制器,以便在整个块中找到正确的todo#U项目id:
@todo_item = @todo_list.todo_items.find(params[:todo_item_id])
嵌套资源不需要两个参数吗?完成待办事项列表待办事项项目路径(@todo\u list,item)@abepertillo是的,我试过了,结果也是错误的。