此视图目前位于views / projects / show.html.erb文件中,但我希望它使用网站控制器删除此文件:
<%= link_to 'Delete', @website, :controller => 'website', :action => 'delete', method: :delete, data: {confirm: "Are you sure you want to delete this asset?"}%>
它返回错误&#39;无法在ProjectsController&#39;中找到动作销毁。此外,我没有在项目控制器中定义@website,所以我应该使用其他东西吗?或者我仍然可以访问它,因为它是在网站控制器中定义的。
#controllers/websites_controller.rb
class WebsitesController < ApplicationController
def new
@project = Project.find(params[:project_id])
@website = @project.assets.build(:type => 'Website', :project_id => Project.find(params[:project_id]), :asset_number => @project.assets.size + 1)
end
def create
@website = current_user.assets.build(website_params)
@website.update_attributes(:project_id => @project)
if @website.save
flash[:notice] = "Asset successfully added."
redirect_to(:controller => 'projects', :action => 'show', :id => @website.project_id)
else
render(:action => 'new')
end
end
def delete
@website = Asset.find(params[:id])
end
def destroy
asset = Asset.find(params[:id]).destroy
flash[:notice] = "The asset '#{asset.title}' has been destroyed Successfully."
redirect_to(:controller => 'projects', :action => 'index')
end
private
def website_params
params.require(:website).permit(:id, :project_id, :asset_number, :title, :type, :url, :page_rank, :rev_company ,:social_pages)
end
end
答案 0 :(得分:0)
如果您在项目的显示页面上使用此链接,那么@website将无法使用,除非它在项目控制器中定义。
也就是说,如果项目和网站之间存在某种关系,您可以使用它而不是在项目控制器中定义@website。
另外,就你的link_to而言,我不相信你可以在link_to中指定控制器和动作。相反,您应该使用@website的路径。哪个应该让你的link_to看起来像这样:
<%= link_to "Delete", website_path(@website), method: :delete, data: {confirm: "Are you sure you want to delete this asset?" %>
但是,您的website_controller似乎要处理的模型实际上是一个资产。如果没有看到你的路线,就很难猜出你是如何设置它们的,但假设你做了类似
的事情map.resources :assets, :controller => 'websites'
在您的路线中。然后在你的link_to而不是使用website_path(@website),你可能会使用asset_path(@website)。
一般来说,通过在ruby中用模型命名不一致的东西来违反rails约定很少是个好主意。如果您的Asset模型使用单表继承,或者您暗示类似于单表继承并且使用控制器来分离职责,那么这可能是一个例外,但您仍需要小心确保映射到正确的位置在你的路线。
你可能想要阅读rails guide for routing,因为它是一个非常好的资源,很好地解释了如何映射destroy,这反过来解释了为什么它的link_to看起来像它的方式。 / p>
答案 1 :(得分:0)
@website
是项目控制器中定义的那个,因为它是一个呈现当前html页面的人。
因此,您要删除的目标暂时无法使用。