我是 Rails 新手,在 product_controller.rb 中有一个功能
def detach
@product.photo = nil
@product.save
end
现在我想从视图文件 show.html.erb 中调用此方法,以便执行该方法。怎么做 ?我可以看到通过 .find(params[id]) 调用了 7 种方法,但这对我来说也不清楚。
我是 Rails 新手,在 product_controller.rb 中有一个功能
def detach
@product.photo = nil
@product.save
end
现在我想从视图文件 show.html.erb 中调用此方法,以便执行该方法。怎么做 ?我可以看到通过 .find(params[id]) 调用了 7 种方法,但这对我来说也不清楚。
您需要添加一条路线,如下所示routes.rb
:
resources :products do
member do
get 'detach' # /products/:id/detach
end
end
这将为您提供detach_product_path(@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) %>
我建议您查看 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
我已经修复了西蒙的答案。但是,您仍然面临问题,因为您没有通过路径传递产品:
<%= 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
Product.find(params[:id])
@product
show
detach action
product_detach_path(Product.first)
2 -resources :products
生成七个默认路由:索引、新建、创建、显示、编辑、更新和销毁。
为了向它添加更多路线,您可以使用member
或collection
。基本上,member
将向产品添加路由(products/1/detach),同时collection
向控制器添加路由,如索引(products/detach)。更多信息在这里。
我希望它有帮助...