例如,我有一个页脚
<%= link_to 'Tweets', tweets_path %>
<%= link_to 'Blogs', blogs_path %>
在推文索引页面中,我想要隐藏<%= link_to 'Tweets', tweets_path %>
。并展示别的东西。我如何知道用户目前的resource
是什么?
具体来说,我想
resources = ['Tweet', 'Blog'] # get the model names, and there maybe something more to be added later
resources.each do |resource|
if controller.controller_name = resource && controller.method_name = 'index'
link_to new_resource_path # for example, link_to new_tweet_path
else
link_to resource_path # for example, link_to tweets_path
end
end
粗略的想法在上面。但是在controller.controller_name
和link_to
方法中,我不知道编写它的细节。
我从Can I get the name of the current controller in the view?找到controller.controller_name
什么是一个好方法呢?
更新:
def footer_helper
resources = ['tweet', 'blog'] # and perhaps something more
resources.each do |resource|
if current_page?(controller: resource.pluralize, action: 'index')
link_to "New #{resource.humanize}", {controller: resource.pluralize, action: 'new'}
else
link_to "#{resource.pluralize.humanize}", {controller: resource.pluralize, action: 'index'}
end
end
end
端
现在我已经把它变成了上面的帮手。但我觉得.pluralize
和.humanize
有点恼火,有什么方法可以摆脱它们吗?
另外,我如何在视图中使用它?当我使用<%= footer_helper %>
时,会显示["tweet", "blog"]
。它没有正确返回。
答案 0 :(得分:2)
params[:action]
将向您显示他们被路由的操作,同样params[:controller]
将找出该操作所在的控制器。您可以使用这些来为您的页脚编写一些逻辑。
答案 1 :(得分:1)
使用current_page?
帮助程序:
resources = ['tweet', 'blog']
resources.each do |resource|
if current_page?(controller: resource, action: 'index')
link_to(resource.humanize, { controller: resource, action: 'new' })
else
link_to(resource.humanize, { controller: resource, action: 'index' })
end
end
使用link_to_if
帮助程序可以改进这一点:
resources = ['tweet', 'blog']
resources.each do |resource|
link_to_if(current_page?(controller: resource, action: 'index'), resource.humanize, {controller: resource, action: 'new'}) do
link_to(resource.humanize, {controller: resource, action: 'index'})
end
end
如果您不想要计算机编写的界面文本(这通常是一个坏主意),请考虑将资源设为Hash
,如下所示:
resources = {'tweets' => "Tweet", 'blogs' => "Blog"}
resources.each do |resource, name|
link_to_if(current_page?(controller: resource, action: 'index'), name, {controller: resource, action: 'new'}) do
link_to(name, {controller: resource, action: 'index'})
end
end
答案 2 :(得分:0)
对于整洁的代码,它有一个很好的宝石:
https://github.com/robotmay/link_to_active_state
这个gem为默认的Rails link_to添加了一些额外的功能来查看帮助器。它提供了一种基于当前路径向链接添加类的非常简单的方法。
看看。
答案 3 :(得分:0)
我使用这种方法:
# application_helper.rb
module ApplicationHelper
def body_id
[body_class, params[:action]].join('-')
end
def body_class
controller.class.to_s.gsub('Controller', '').underscore.dasherize.gsub('/', '-')
end
end
在我的布局中:
# application.html.erb
<body id="<%= body_id %>" class="<%= body_class %>">
</body>
因此对于TweetsController#index
,这会呈现
<body id="tweets-index" class="tweets">
现在,您可以根据用户所在的控制器或控制器操作应用CSS:
body#tweets-index a.tweet-links {
display: none;
}