在不同资源之间共享部分

时间:2011-11-18 18:02:07

标签: ruby-on-rails ruby-on-rails-3.1 partial-views

我的观点中有以下代码:

- if admin?
  .meta
    Administrator options: 
    = link_to 'Edit This Post', edit_post_path(@post)
    |
    = link_to 'Delete This Post', @post, :method => 'delete', :confirm => 'Are you sure?'

我发现我经常使用相同的基本代码段,但有时使用不同的资源,有时页面上有多个资源。我想把它提取到一个部分来干它,但我需要写,所以它可以适用于任何模型的本地或实例变量。例如,我需要它来使用:

@post, post, @page, page

你是怎么做到的?

2 个答案:

答案 0 :(得分:1)

您可以使用:object方法中的:collectionrender选项将变量提交到部分。 :object选项将单个对象传递给可包含任何内容的partial。 :collection选项用于传递必须来自同一Class的对象数组。

例如,你有@post并将其传递给像这样的部分

<%= render :partial => 'layouts/my_partial', :object => @post, :as => :my_local_var %>

然后,您可以通过调用部分中的my_local_var来访问该对象。使用:collection略有不同,但您可以在此处自行阅读:http://guides.rubyonrails.org/layouts_and_rendering.html

问题是由于路径名称而在不同类中使用一个部分。然后你无法使用edit_modelname_path(@instance_var),你必须使用{ :controller => params[:controller], :action => 'edit' }方法中的路线哈希link_to

//对于链接创建没有params[:controller]

它只是一个想法,我之前没有这样做,但你可以试试这个例子:

您渲染部分并使用:object => @instancevar, :as => :my_local_var您可以使用以下行创建动态链接:

<%= link_to "link text", { :controller => my_local_var.class.to_s.pluralize.downcase, :action => 'edit', :id => my_local_var.id } %>

然后你不依赖于params[:controller],但能够链接到vars编辑链接。

答案 1 :(得分:1)

您可以干净地将您的partial写成独立于给定对象:

- if admin?
  .meta
    Administrator options: 
    = link_to 'Edit', [:edit, object]
    |
    = link_to 'Delete', object, :method => 'delete', :confirm => 'Are you sure?'

然后你可以做类似

的事情
render :partial => 'shared/admin_link', :locals => { :object => @post }