2011-11-18 73 views
0

我的代码在我的观点如下位:分享部分不同资源之间

- 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

写的部分和向它传递参数,将不是解决你的问题?只是谷歌传递参数,你应该没问题 – aishwarya

+0

真正的问题是路由助手,你怎么做一个通用的“编辑这个”链接而不知道型号名称? – Andrew

回答

1

你可以清晰地写你的部分是独立的给定对象:

- 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 } 
+0

'= link_to'编辑',[:编辑,对象]'辉煌!这是记录在某处吗?这正是我一直在寻找的。 – Andrew

+0

我再也找不到任何“官方”文档了,但[在这里](http://apidock.com/rails/ActionView/Helpers/UrlHelper/url_for)在评论中提到它。 – nathanvda

1

可以使用在render方法:object:collection选项提交一个变量的部分。 :object选项将单个对象传递给可包含任何内容的部分。 :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

A由于路由名称,问题将是不同类中的一个部分的使用。那么你不能使用edit_modelname_path(@instance_var)你必须在link_to方法中使用路由Hash { :controller => params[:controller], :action => 'edit' }

//对于链接创建wihout 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]但可以链接到瓦尔编辑链接。

+0

这是有帮助的,谢谢!你能想到一种创建编辑链接而不依赖于控制器参数的方法吗?我可能希望在同一屏幕上的多个不同模型的主页上有这种链接,但这些链接都不会对应于当前正在渲染视图的控制器。如果你有一个想法如何从给定的模型实例推断出编辑链接,那太棒了! – Andrew

+0

查看帖子更新 – davidb

+0

谢谢David,这非常有帮助。 – Andrew