0

我是 Rails 新手,在 product_controller.rb 中有一个功能

def detach
  @product.photo = nil
  @product.save
end

现在我想从视图文件 show.html.erb 中调用此方法,以便执行该方法。怎么做 ?我可以看到通过 .find(params[id]) 调用了 7 种方法,但这对我来说也不清楚。

4

3 回答 3

2

您需要添加一条路线,如下所示routes.rb

resources :products do
  member do
    get 'detach' # /products/:id/detach
  end
end

这将为您提供detach_product_path(@product)可以在您的视图中使用的内容。您可能还需要在 detach 方法中进行重定向:

def detach
  @product = Product.find(params[:id])
  @product.photo = nil

  if @product.save
    redirect_to @product, notice: 'Photo was detached!'
  end
end
于 2013-03-08T10:41:09.717 回答
1

尝试更改如下

<%= link_to 'detach_image', product_detach_path(@product) %>

我建议您查看 guides.rubyonrails.org/routing.html。

你可以这样做,

你可以使用匹配

match '/update_profile', :to => 'users#update_profile'

或者

resources :users do
  get 'update_profile', on: :member
end

然后你肯定会在你的用户控制器中有方法

def update_profile
  @user = User.find(params[:id])

  if @user.save
    redirect_to @user, notice: 'user updated successfully!'
  end
end
于 2013-03-08T11:24:04.160 回答
1

我已经修复了西蒙的答案。但是,您仍然面临问题,因为您没有通过路径传递产品:

<%= link_to 'detach_image', detach_product_path %>

您需要将产品传递给操作:

<%= link_to 'detach_image', detach_product_path(@product) %>

否则,Product.find(params[:id])将找不到任何产品,并且@product将变为空...

编辑以回答您的问题:

1 -是控制器product_detach_path中动作的助手。还有,它做同样的事情,但还包括当前主机、端口和路径前缀。更多细节在这里。 但是,它没有传递任何参数,因此找不到产品。因此,您必须指定要查找的产品。在操作中定义,因此它在您的视图中可用,但您可以为.... 发送任何其他产品。也许是第一个:detachproductproduct_detach_url
Product.find(params[:id])@productshowdetach actionproduct_detach_path(Product.first)

2 -resources :products生成七个默认路由:索引、新建、创建、显示、编辑、更新和销毁。
为了向它添加更多路线,您可以使用membercollection。基本上,member将向产品添加路由(products/1/detach),同时collection向控制器添加路由,如索引(products/detach)。更多信息在这里

我希望它有帮助...

于 2013-03-08T11:43:34.587 回答