Rails链接到不同视图中的另一个控制器

时间:2014-06-06 12:25:18

标签: ruby-on-rails

此视图目前位于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

2 个答案:

答案 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)

show动作中可用的

@website是项目控制器中定义的那个,因为它是一个呈现当前html页面的人。 因此,您要删除的目标暂时无法使用。