如何从rails中的视图模板调用Controller函数?

时间:2013-03-08 10:27:43

标签: ruby-on-rails ruby-on-rails-3

我是Rails的新手,并且在product_controller.rb中有一个函数

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

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

3 个答案:

答案 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 :productsmember。基本上,collection将添加到产品的路径(products / 1 / detach),而member将添加到控制器的路由,如index(products / detach)。更多信息here

我希望它有所帮助...