创建自定义move_up路由和move_down操作/路由Rails

时间:2012-02-28 23:23:32

标签: ruby-on-rails ruby ruby-on-rails-3 rubygems acts-as-list

我正在尝试使用向上和向下箭头创建两个小按钮,并根据它对我的产品进行排序。我有一个名为Product的模型,我正在使用acts_as_list来跟踪位置。

我是否在控制器中执行此类操作来创建路线?

resources :products
post "products/move_up"
post "products/move_down"

和我的产品控制器

def move_up
  @product.find(params[:id])
  @product.move_higher
end

def move_down
  @product.find(params[:id])
  @product.move_lower
end

在我看来

<%= link_to "UP", products_move_up_path(product) %>
<%= link_to "Down", products_move_down_path(product) %>

但我没有做对。我一直收到错误

找不到ID = move_up

的产品

有人可以帮我创建这种路线关系吗?

修改: 现在我收到了错误

当你没想到它时,你有一个零对象! 您可能期望一个Array实例。 评估nil.find

时发生错误

这是一些更多的代码

查看代码

<ul>
<% item.children.each do |child| %>
<li id='category_<%=child.id %>'>
  <span><%= child.name %></span>

  <% child.products.position.each do |product| %>
    <br /><%= link_to "UP", move_up_product_path(product), method: :put %> | 
    <%= link_to "Down", move_down_product_path(product), method: :put %> ----------<%= product.position %> 
   <%= product.name %>
    <%= link_to 'Edit', edit_product_path(product) %>
    <%= link_to 'Delete', product, :method => :delete, :confirm => "Are you sure you want to delete this product?" %> <br />

    <% end %> 
  <%= render 'shared/children', :item => child unless child.leaf? %>
  </li>
 <% end %> <br />
 </ul>

它似乎挂起的代码就在这里

 def move_up
   #Need to add a before filter to find product so I don't have to keep doing it.
   @product.find(params[:product])
   @product.move_higher
 end

执行查找时。谢谢!

1 个答案:

答案 0 :(得分:4)

所以'Up'和'Down'实际上更像是一个更新,所以你想要使用'PUT',但是,你还没有正确定义你的路线。试试这个:

resources :products do 
  member do
    put :move_up
    put :move_down
  end
end

哪个应创建您要查找的路线。

此外,您的链接需要执行:put,而不是:get,这是链接的默认操作。试试这个:

<%= link_to "UP", move_up_product_path(product), method: :put %>

这应该对你有用,检查你的路线,你可以随时运行rake routes

希望这有帮助,只要接受/投票就可以了!