我的观点中有以下代码:
- 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
你是怎么做到的?
答案 0 :(得分:1)
您可以使用:object
方法中的:collection
或render
选项将变量提交到部分。 :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 }