我是Rails的新手,并且在product_controller.rb中有一个函数
def detach
@product.photo = nil
@product.save
end
现在我想从视图文件show.html.erb中调用此方法,以便执行该方法。怎么做 ?我可以看到7种方法通过.find(params [id])调用,但这对我来说也不清楚。
答案 0 :(得分:2)
您需要在routes.rb
:
resources :products do
member do
get 'detach' # /products/:id/detach
end
end
这将为您提供可在视图中使用的detach_product_path(@product)
。您可能还需要在分离方法中进行重定向:
def detach
@product = Product.find(params[:id])
@product.photo = nil
if @product.save
redirect_to @product, notice: 'Photo was detached!'
end
end
答案 1 :(得分: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
答案 2 :(得分: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
是控制器detach
中操作product
的帮助程序。还有product_detach_url
,它做同样的事情,但也包括当前的主机,端口和路径前缀。更多细节here
但是,它没有通过任何参数,因此Product.find(params[:id])
无法找到该产品。因此,您必须指定要查找的产品。 @product
操作中定义了show
,因此您可以在视图中找到它,但您可以发送detach action
的任何其他产品....也许是第一个:{{1 }}
2 - product_detach_path(Product.first)
生成seven default routes:索引,新建,创建,显示,编辑,更新和销毁。
要向其添加更多路线,您可以使用resources :products
或member
。基本上,collection
将添加到产品的路径(products / 1 / detach),而member
将添加到控制器的路由,如index(products / detach)。更多信息here。
我希望它有所帮助...