Rails 4:控制器之间的路由和共享操作?什么是正确的惯例?

时间:2014-01-22 23:52:05

标签: ruby ruby-on-rails-4

我正在铁轨中构建一个Todo列表,试图了解它是如何工作的。我从另一个控制器的视图中调用控制器的action时遇到了问题。

我有TodoList has_many TodoItemTodoItem 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;的

  1. 为什么我的 TodoList#show 视图中未定义此complete#action
  2. 在控制器之间共享操作的正确惯例是什么?
  3. 感谢您的帮助。

1 个答案:

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