1

我目前正在编写一个新的 Rails 应用程序,并且在我的页面顶部附近有一个名为 background 的 div,其中包含图像、标题和一些子标题文本。

目前我已经创建了单独的辅助方法,如下所示,通过对动作和控制器参数进行测试来传递每个元素。

然而,这似乎不是一种非常有效的代码实现方式,所以我想知道在一个方法中将三个元素一起传递的最佳方式是什么?

目前我有这样的设置:

def background
    if params[:action] == "index" && params[:controller] == "everydays"
        return "/assets/everyday.jpg"
    elsif params[:action] == "index" && params[:controller] == "mens"
        return "/assets/mens.jpg"
    elsif params[:action] == "index" && params[:controller] == "womens"
        return "/assets/womens.jpg"
    end
end

def title_h1
    if params[:action] == "index" && params[:controller] == "everydays"
        return "Everyday"
    elsif params[:action] == "index" && params[:controller] == "mens"
        return "Mens"
    elsif params[:action] == "index" && params[:controller] == "womens"
        return "Womens"
    end
end


def title_h3
    if params[:action] == "index" && params[:controller] == "everyday"
        return "Example text for this Everyday Section"
    elsif params[:action] == "index" && params[:controller] == "mens"
        return "Example text for this Mens Section"
    elsif params[:action] == "index" && params[:controller] == "womens"
        return "Example text for this Womens Section"
    end
end

人们可以提供的任何建议将不胜感激。

4

4 回答 4

2

你怀疑是对的,这是一种可怕的代码气味,并且令人惊讶地溢出到答案中!我会试着给这个页面带来一点理智。

为特定于页面的背景图像使用内容块

# views/layouts/application

<% if content_for?(:background_image) %>
  <%= yield(:background_image) %>
<% else %>
  <img src="default" />
<% end %>

# views/everydays/index

<% content_for :background_image %>
  <img src="/assets/everyday.jpg" />
<% end %>

将语言环境文件用于特定于页面的文本

# locales/en.yml

everydays:
  index:
    title_h1: 'Everyday'
    title_h3: 'Example text for this Everyday Section'

# views/everydays/index

<h1><%= t('everydays.index.title_h1') %></h1>

如果h1标签不在您的index模板中,例如,是模板中的站点范围标签application,那么您可以使用如上所述的代码块,或者您可以创建一个帮助器,它根据控制器获取相关标题:

# application_helper.rb

def title(tag)
  t("#{params[:controller]}.#{params[:action]}.title_#{tag}")
end

# usage
<h1><%= title('h1') %></h1>

如您所见,有很多方法可以解决这个问题,甚至可以改进上述方法。

于 2013-07-12T09:17:31.540 回答
0

一个方法中可以有多个返回值,如下所示:

def my_helper
  if action == 'something'
    return 'first return', 'second return', 'third return'
  else
    return 'first return 2', 'second return 2', 'third return 2'
  end
end

然后你可以调用这个方法:

first_value, second_value, third_value = my_helper

<%= first_value %>
<%= second_value %>
<%= third_value %>
于 2013-07-12T08:42:59.047 回答
0

您可以只使用一种方法(例如:get_css_attribute_values)并返回一个哈希,其中键是 CSS 属性的名称,值是您要传递的字符串。

def get_css_attribute_values
  if params[:action] == 'index' && params[:controller] == 'everydays'
    return {:background_image => '/assets/everyday.jpg', :title_h1 => 'Everyday', :title_h3 => 'Example text for this Everyday Section' }
  elsif params[:action] == 'index' && params[:controller] == 'mens'
    return {:background_image => '/assets/mens.jpg', :title_h1 => 'Mens', :title_h3 => 'Example text for this Mens Section'}
  elsif params[:action] == 'index' && params[:controller] == 'womens'
    return {:background_image => '/assets/womens.jpg', :title_h1 => 'Womens', :title_h3 => 'Example text for this Womens Section'}
  end
end

然后您可以在视图中访问所有这些属性:

get_css_attribute_values[:background_image]
get_css_attribute_values[:title_h1]
get_css_attribute_values[:title_h3]
于 2013-07-12T08:46:20.387 回答
0

我将开始使用哈希,因为它消除了 if 子句正在执行的许多测试(因此以下都是辅助方法):

def fragments
  return {
    "everydays#index" => {
      :background => "/assets/everyday.jpg", 
      :title => "Everyday",
      :description => "Example text for this Everyday Section"
    },
    "mens#index" => {
      ...
    }
    ...
  }
end

def fragment_for(segment)
  fragment = fragments["#{params[:controller]}##{params[:action]}"]
  fragment ? fragment[section] : nil
end

然后你可以把你的意见:

<%= fragment_for :background %>

或者

<%= fragment_for :title %>

等等

顺便说一句,“男人”的复数是“男人”,“女人”的复数是“女人”。

于 2013-07-12T15:06:07.797 回答