Переопределение вспомогательных методов в Ruby On Rails - PullRequest
1 голос
/ 24 марта 2009

У меня есть ситуация, когда частичный заголовок вызывается стандартной версткой. (Я предполагаю, что это довольно распространенное явление). В заголовке есть поле поиска - как в stackoverlow. Однако, когда пользователь находится на странице поиска, я хочу удалить поле поиска из заголовка.

Я попытался поместить метод в файл ApplicationHelper.rb, например:

def search_page?
    return false;
end

И тогда в SearchHelper.rb у меня есть это:

def search_page?
    return true;
end

Это не работает, потому что используется функция search_page в SearchHelper.rb независимо от того, какой контроллер отображает представление. Я знаю, что мог бы определить новый макет и добавить параметр в частичный заголовок, чтобы сигнализировать не отображать окно поиска, но это выглядит как излишнее.

Ответы [ 2 ]

2 голосов
/ 24 марта 2009

Прежде всего, несколько настроек вашего 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 голос
/ 24 марта 2009

В вашем помощнике приложения определите этот метод:

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

Замените "search" именем вашего контроллера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...