создание динамических вспомогательных методов в рельсах - PullRequest
0 голосов
/ 17 декабря 2009

Я пытаюсь создать несколько динамических вспомогательных методов, таких как:

show_admin_sidebar
show_posts_sidebar
show_users_sidebar

Пока у меня есть это в моем файле helper.rb:

#spits out a partial 
def show_sidebar(name, show_sidebar = true)
  @content_for_sidebar = render :partial => "partials/#{name}"                       
  @show_sidebar = show_sidebar
end

def show_sidebar?
  @show_sidebar
end

В моем файле макета приложения у меня есть это: (NB - я использую HAML):

- if show_sidebar?
  = yield(:sidebar)

Это позволяет мне сказать следующее в моих взглядах:

- show_sidebar(:foo)
- show_sidebar(:bar)

И это приводит к желаемому частичному.

Проблема в том, что я могу добавить только одну боковую панель на страницу. Итак, я считаю, что мне нужны динамические методы, такие как: show_admin_sidebar, show_foo_sidebar.

Итак, я попытался сделать это:

def show_#{name}_sidebar(show_sidebar = true)
@name = name  
@content_for_#{@name}_sidebar = render :partial => "partials/#{@name}"                       
  @show_sidebar = show_sidebar
end

а затем в моем макете:

- if show_sidebar?
  = yield("{@name}_sidebar")

Но рельсам это совсем не нравится.

Я перепробовал почти все, что могу придумать в файле помощника, и ничего не работает.

Причина, по которой я использую вспомогательные методы для этого, заключается в том, что я хочу, чтобы мой div контента был на 100% ширины страницы, если только не имеется боковой панели, в этом случае основное содержимое переходит в меньший div, а содержимое боковой панели переходит в свой собственный. ..

Если я не могу заставить это работать, то я могу легко решить проблему, просто добавив частичные значения вручную, но я бы хотел обдумать это ...

Кто-нибудь имел опыт работы с подобными вещами?

Ответы [ 3 ]

4 голосов
/ 02 февраля 2011

Весь подход к этому был странно слишком сложным, совсем не следовал соглашениям Rails и не имел ни малейшего смысла, и не стыдился предыдущих респондентов за то, что он включил этот подход, а не помог ему упростить. Приношу свои извинения за опоздание на 13 месяцев с ответом.

Ваш контроллер должен решить, следует ли показывать боковую панель или нет, и установить для переменной экземпляра @side_bar_name либо ноль, либо строку имени боковой панели. Затем где-нибудь в коде общего представления, возможно, views / layouts / application.html.erb, вы получите что-то простое:

<% if @side_bar_name %>
<%= render :partial => "partials/#{@side_bar_name}" %>
<% end %>

Или еще лучше:

<%= render(:partial => "partials/#{@side_bar_name}") if @side_bar_name %>

Если вы хотите использовать помощник (что неплохо для сохранения вашего кода СУХИМЫМ и читабельным), то в основном это будет тот же код, только что перемещенный в помощник.

<%= side_bar_helper %>

def side_bar_helper
  render(:partial => "partials/#{@side_bar_name}") if @side_bar_name
end

То, что делает контроллер, зависит от вас. Это, вероятно, будет делать что-то вроде этого:

if session[:show_side_bar]
  # maybe use cookies instead of session, or store user preference in a database
  @side_bar_name = session[:side_bar_name]
end
2 голосов
/ 17 декабря 2009

Вот решение для вас, однако я бы не предложил слишком много метапрограммирования:

#Add the following snippet to the proper helper module:
['admin','user','whatever'].each do |name|
  class_eval{
    "def show_#{name}_sidebar(show_sidebar = true)
       @name = #{name}  
       @content_for_#{@name}_sidebar = render :partial => 'partials/#{@name}'                       
       @show_sidebar = show_sidebar
     end"
  }
end
0 голосов
/ 17 декабря 2009

def show _ # {name} _sidebar (show_sidebar = true)

Это не похоже на настоящий Руби для меня. Вы анализируете и оцениваете это сами или просто добавляете это прямо в файл и ожидаете, что это сработает?

...