Ruby on rails 如何从rails中的视图模板进行控制器函数调用?

Ruby on rails 如何从rails中的视图模板进行控制器函数调用?,ruby-on-rails,ruby-on-rails-3,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])调用的,但我也不清楚 您需要添加一条路由,类似于routes.rb中的内容: resources :products do member do get 'de

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

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

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

您需要添加一条路由,类似于
routes.rb中的内容:

resources :products do
  member do
    get 'detach' # /products/:id/detach
  end
end
这将为您提供可在视图中使用的
分离产品路径(@product)
。您可能还需要在detach方法中进行重定向:

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

  if @product.save
    redirect_to @product, notice: 'Photo was detached!'
  end
end

您需要添加一条路由,类似于
routes.rb中的内容:

resources :products do
  member do
    get 'detach' # /products/:id/detach
  end
end
这将为您提供可在视图中使用的
分离产品路径(@product)
。您可能还需要在detach方法中进行重定向:

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

  if @product.save
    redirect_to @product, notice: 'Photo was detached!'
  end
end
试着改变如下

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

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

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

  if @user.save
    redirect_to @user, notice: 'user updated successfully!'
  end
end
试着改变如下

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

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

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

  if @user.save
    redirect_to @user, notice: 'user updated successfully!'
  end
end

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

<%= link_to 'detach_image', detach_product_path %>

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

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

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

编辑回答您的问题:

1-
product\u detach\u path
是控制器
product
中操作
detach
的助手。还有
产品\u detach\u url
,它做同样的事情,但也包括当前主机、端口和路径前缀。更多详细信息。
但是,它不传递任何参数,因此
Product.find(params[:id])
无法找到该产品。因此,您必须指定要查找的产品
@product
是在
显示
操作中定义的,因此它在您的视图中可用,但您可以为
分离操作
发送任何其他产品。。。。可能是第一个:
product\u detach\u路径(product.first)

2.
资源:产品
生成索引、新建、创建、显示、编辑、更新和销毁。
要向其中添加更多路由,可以使用
member
collection
。基本上,
member
将向产品(产品/1/detach)添加路由,而
collection
将向控制器添加路由,如索引(产品/detach)。更多信息


我希望它能帮助

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

<%= link_to 'detach_image', detach_product_path %>

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

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

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

编辑回答您的问题:

1-
product\u detach\u path
是控制器
product
中操作
detach
的助手。还有
产品\u detach\u url
,它做同样的事情,但也包括当前主机、端口和路径前缀。更多详细信息。
但是,它不传递任何参数,因此
Product.find(params[:id])
无法找到该产品。因此,您必须指定要查找的产品
@product
是在
显示
操作中定义的,因此它在您的视图中可用,但您可以为
分离操作
发送任何其他产品。。。。可能是第一个:
product\u detach\u路径(product.first)

2.
资源:产品
生成索引、新建、创建、显示、编辑、更新和销毁。
要向其中添加更多路由,可以使用
member
collection
。基本上,
member
将向产品(产品/1/detach)添加路由,而
collection
将向控制器添加路由,如索引(产品/detach)。更多信息


我希望它能帮助

调用发生在控制器与视图之间,而不是视图与控制器之间。因此,您不需要调用,routes将为控制器操作执行此操作。调用在控制器到视图之间进行,而不是从视图到控制器。因此,您不需要调用,routes将为控制器操作执行此操作。谢谢,我需要参考资料:products下的“get'/detach'=>”products#detach',on::member”吗?在运行rake路由时,它给了我错误的语法。这是我当前在路由中的代码,“resources:products do get'detach'=>“products#detach”end,创建的路由是“product#detach get/products/:product#id/detach(:format)products#detach”,我已经在show.html.erb文件中放了-”。。我得到错误“没有路由匹配{:action=>“detach”,:controller=>“products”}“您不需要”=>“products#detach”@muhamadmdawais@Simon-我现在已经得到了正确的路由,并且显示了显示页面,但是当我单击“”链接时,它在ProductsController中显示NoMethodError#detach未定义的方法'photo='对于nil:NilClass,带有错误的行是-“@product.photo=nil”我已经更新了我的答案,请查看并随意接受。如果看起来不错,谢谢,我是否需要资源:产品下的“get'/detach'=>”产品#detach',on::member?在运行rake路由时,它给了我错误的语法。这是我当前在路由中的代码,“resources:products do get'detach'=>“products#detach”end,创建的路由是“product#detach get/products/:product#id/detach(:format)products#detach”,我已经在show.html.erb文件中放了-”。。我得到的错误是“没有路由匹配{:action=>“detach”,:controller=>“products”}“您不需要”=>“products#detach'”@muhamdawais@Simon-我已经得到了路由