在Ruby On Rails中重新定义Helper方法

时间:2009-03-24 00:40:57

标签: ruby-on-rails ruby

我遇到标准布局调用标题部分的情况。 (我认为这是相当普遍的)在标题中是一个搜索框 - 就像在stackoverlow上一样。但是,当用户在搜索页面上时,我想从标题中删除搜索框。

我尝试做的是在ApplicationHelper.rb文件中添加一个方法,如下所示:

def search_page?
    return false;
end

然后在SearchHelper.rb中我有这个:

def search_page?
    return true;
end

这不起作用,因为SearchHelper.rb中的search_page函数是正在使用的函数,无论控制器呈现视图的是什么。我知道我可以定义一个新的布局,并在标题部分添加一个参数,以表示不呈现搜索框,但这似乎有点过头了。

2 个答案:

答案 0 :(得分:2)

首先,对Ruby进行一些调整。

def search_page?
  true
end

您不需要分号或return(无论最后一行是您方法的返回值)。

其次,初始化应用程序时会加载所有帮助程序。你可以改变这种行为,但这可能不值得。

至于其余的,假设你有一个名为_search_form.html.erb的部分。创建一个很好的帮助方法(例如,在search_helper.rb中)

def search_form
  render(:partial => 'search/search_helper') unless @search_page
end

使用此选项从布局文件中调用搜索表单。从那时起,你就有了一些选择。

您可以在控制器中创建before_filter

before_filter :set_search_page

...your actions here...

private

def set_search_page
  @search_page = true
end

或者在动作中设置变量:

def some_action
  @search_page = true
end

我会说这实际上是一个视图问题,而不是你想要在控制器中做的事情。我会创建一个这样的辅助方法(同样,在search_helper.rb中)。

def search_page
  @search_page = true
end

然后在该页面的顶部,我会使用以下内容:

<% search_page %>

(请注意,它是<%而不是<%= - 没有输出。)

这里的优点是可以从控制器中保留不必要的实例变量。

答案 1 :(得分:1)

在您的应用程序助手中,定义此方法:

def search_page?
  controller.controller_name != "search"
end

"search"替换为控制器的名称。