我是新来的Rails和product_controller.rb如何从视图模板在轨道中进行控制器函数调用?
def detach
@product.photo = nil
@product.save
end
具有这样的功能,现在我想调用此方法,以便该方法得到执行从查看文件show.html.erb。怎么做 ?我可以看到7个方法通过.find(params [id])调用,但这对我来说也是不清楚的。
我是新来的Rails和product_controller.rb如何从视图模板在轨道中进行控制器函数调用?
def detach
@product.photo = nil
@product.save
end
具有这样的功能,现在我想调用此方法,以便该方法得到执行从查看文件show.html.erb。怎么做 ?我可以看到7个方法通过.find(params [id])调用,但这对我来说也是不清楚的。
尝试改变如下
<%= 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
谢谢,最后它的工作:)几个问题。 1. product_detach_path(@product)和product_detach_path之间有什么区别? 2.这个代码是做什么的“资源:产品做 成员做 得到'detach'#/ products /:id/detach end end” – iCyborg 2013-03-08 11:47:10
:)简单的人,你必须告诉你的方法你需要哪些东西更新,所以我们'product_detach_path(@product)'加上我建议你从guides.rubyonrails.org采取教程。第二个答案,它只是生成路线并告诉控制器期望用户点击链接(在你的情况下)的产品。 接受我的回答。 :) 谢谢。 – 2013-03-08 11:52:42
你需要添加routes.rb
的路线,像这样:
这会给你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
谢谢,我需要这个“得到'/ detach'=>'产品#detach',在:: member下:resources:products?当运行rake路由时,它给我错误的语法不正确。 – iCyborg 2013-03-08 11:18:10
这是我当前在路由中的代码,“资源:产品做 得到'detach'=>”产品#detach“ 结束 ”,创建的路径是 - “product_detach GET/products /:product_id/detach(。 :格式)产品#detach“,我已经把show.html.erb文件 - ”<%= link_to'detach_image',product_detach_path%>“..我得到错误”没有路线匹配{:行动=>“分离“::controller =>”products“}” – iCyborg 2013-03-08 11:24:02
你不需要“=>'products#detach'' – 2013-03-08 11:26:00
我h大家解决了西蒙的回答。但是,你仍然面临着因为你不及格的产品与路径问题:
<%= link_to 'detach_image', detach_product_path %>
您需要的产品传递给动作:
<%= link_to 'detach_image', detach_product_path(@product) %>
否则,Product.find(params[:id])
不会找到任何产品,以及@product
会得到空...
编辑回答您的问题:
1 - product_detach_path
是控制器product
中动作detach
的帮手。还有product_detach_url
,它做同样的事情,但也包括当前的主机,端口和路径前缀。更多详情here。
但是,它不会传递任何参数,因此Product.find(params[:id])
找不到产品。出于这个原因,你必须指定你想要找的产品。 @product
在show
动作定义,所以它是提供你的看法,但你可以发送的detach action
任何其他产品....也许第一个:product_detach_path(Product.first)
2 - 的resources :products
产生seven default routes:指数,新,创建,显示,编辑,更新和销毁。
为了添加更多的路线,你可以使用member
或collection
。基本上,member
将为产品(产品/ 1 /分离)添加路线,而collection
将向控制器添加路线,如索引(产品/分离)。更多信息here。
我希望它有帮助...
调用发生从控制器到视图,但不是从视图到控制器。那么你不需要调用,路由会为控制器操作做到这一点。 – 2013-03-08 10:33:11