Rails:如何确定用户正在查看的页面?

时间:2013-12-18 11:59:10

标签: ruby-on-rails

例如,我有一个页脚

<%= 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_namelink_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"]。它没有正确返回。

4 个答案:

答案 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;
}