Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby Rails 4:控制器之间的路由和共享操作?什么';什么是正确的惯例?_Ruby_Ruby On Rails 4 - Fatal编程技术网

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

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

我正在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.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是的,我试过了,结果也是错误的。