2013-03-08 42 views
0

我是新来的Rails和product_controller.rb如何从视图模板在轨道中进行控制器函数调用?

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

具有这样的功能,现在我想调用此方法,以便该方法得到执行从查看文件show.html.erb。怎么做 ?我可以看到7个方法通过.find(params [id])调用,但这对我来说也是不清楚的。

+1

调用发生从控制器到视图,但不是从视图到控制器。那么你不需要调用,路由会为控制器操作做到这一点。 – 2013-03-08 10:33:11

回答

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 
+0

谢谢,最后它的工作:)几个问题。 1. product_detach_path(@product)和product_detach_path之间有什么区别? 2.这个代码是做什么的“资源:产品做 成员做 得到'detach'#/ products /:id/detach end end” – iCyborg 2013-03-08 11:47:10

+0

:)简单的人,你必须告诉你的方法你需要哪些东西更新,所以我们'product_detach_path(@product)'加上我建议你从guides.rubyonrails.org采取教程。第二个答案,它只是生成路线并告诉控制器期望用户点击链接(在你的情况下)的产品。 接受我的回答。 :) 谢谢。 – 2013-03-08 11:52:42

2

你需要添加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 
+0

谢谢,我需要这个“得到'/ detach'=>'产品#detach',在:: member下:resources:products?当运行rake路由时,它给我错误的语法不正确。 – iCyborg 2013-03-08 11:18:10

+0

这是我当前在路由中的代码,“资源:产品做 得到'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

+1

你不需要“=>'products#detach'' – 2013-03-08 11:26:00

1

我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])找不到产品。出于这个原因,你必须指定你想要找的产品。 @productshow动作定义,所以它是提供你的看法,但你可以发送的detach action任何其他产品....也许第一个:product_detach_path(Product.first)

2 - 的resources :products产生seven default routes:指数,新,创建,显示,编辑,更新和销毁。
为了添加更多的路线,你可以使用membercollection。基本上,member将为产品(产品/ 1 /分离)添加路线,而collection将向控制器添加路线,如索引(产品/分离)。更多信息here

我希望它有帮助...

+0

谢谢,最后它的工作:)几个问题。 1. product_detach_path(@product)和product_detach_path之间有什么区别? 2.这是什么代码路由代码做“资源:产品做 成员做 得到'detach'#/产品/:id /分离 结束 结束” – iCyborg 2013-03-08 11:47:51

+0

谢谢,真的很感激它加布里埃尔 – iCyborg 2013-03-08 12:12:48

相关问题