Ruby on rails 在Rails中突出显示活动按钮的干净通用方法

Ruby on rails 在Rails中突出显示活动按钮的干净通用方法,ruby-on-rails,Ruby On Rails,我想突出显示三个按钮中的一个。我对我目前的工作方式不太满意,所以我想请你喝几杯 对于我使用的过滤器,我有三个按钮应该处于活动状态:我的票证、团队票证和特定用户的票证 # tickets_controller.rb @filter_by_user_id_active = Array.new ba = %w(btn-default btn-primary) # Determine, which button to highlight if @user == current_user @fil

我想突出显示三个按钮中的一个。我对我目前的工作方式不太满意,所以我想请你喝几杯

对于我使用的过滤器,我有三个按钮应该处于活动状态:我的票证、团队票证和特定用户的票证

# tickets_controller.rb

@filter_by_user_id_active = Array.new
ba = %w(btn-default btn-primary)

# Determine, which button to highlight
if @user == current_user
  @filter_by_user_id_active[0] = ba[1]
  @filter_by_user_id_active[1] = ba[0]
  @filter_by_user_id_active[2] = ba[0]
elsif @user != nil && @user != current_user
  @filter_by_user_id_active[0] = ba[0]
  @filter_by_user_id_active[1] = ba[0]
  @filter_by_user_id_active[2] = ba[1]
else
  @filter_by_user_id_active[0] = ba[0]
  @filter_by_user_id_active[1] = ba[1]
  @filter_by_user_id_active[2] = ba[0]
end 
并且认为:

= link_to "?user_id=#{current_user.id}", {:type => "button",
:class => "btn #{@filter_by_user_id_active[0]}"} do
My tickets
其他链接使用
[1]
[2]

这是其中一个链接。控制器将根据条件返回
btn default
btn primary
。但我发现,这不是干净的通用代码

你有什么想法吗


提前谢谢

一种解决方案可以是:

ba = %w(btn-default btn-primary)
@filter_by_user_id_active = Array.new(3){ba[0]}
def link_class(index)
  return 'btn-primary' if @user && [0,2].include?(index) || index == 1
  'btn-default' 
end
无需每次更新所有按钮


一种解决办法是:

ba = %w(btn-default btn-primary)
@filter_by_user_id_active = Array.new(3){ba[0]}
def link_class(index)
  return 'btn-primary' if @user && [0,2].include?(index) || index == 1
  'btn-default' 
end
无需每次更新所有按钮


一个更简单的方法就是这样

ba = %w(btn-default btn-primary)    
@filter_by_user_id_active = [ba[0],ba[0],ba[0]]


if @user == current_user
  @filter_by_user_id_active[0] = ba[1]
elsif @user.present?
  @filter_by_user_id_active[2] = ba[1]
else
  @filter_by_user_id_active[1] = ba[1]
end
但若我必须这样做,那个么我不会在视图中的控制器或独立逻辑中添加这个类决策。相反,我会这样做:

= link_to "?user_id=#{current_user.id}", {:type => "button",
:class => "btn #{@user==current_user ? "btn-primary" : 'btn-default'}"} do
My tickets
end
同样,对于其他两个链接,相同的逻辑只是条件改变,如
@user!=当前用户
@user.blank?

更新

您可以为整个按钮定义一个助手方法,如

def link_to_tickets url , text,active_class_condition
    link_to url, {:type => "button",:class => "btn #{active_class_condition ? "btn-primary" : 'btn-default'}"} do
        text
    end
end
然后在视图中调用此方法

=link_to_tickets "?user_id=#{current_user.id}" , "My Tickets" , @user == current_user

一个更简单的方法就是这样

ba = %w(btn-default btn-primary)    
@filter_by_user_id_active = [ba[0],ba[0],ba[0]]


if @user == current_user
  @filter_by_user_id_active[0] = ba[1]
elsif @user.present?
  @filter_by_user_id_active[2] = ba[1]
else
  @filter_by_user_id_active[1] = ba[1]
end
但若我必须这样做,那个么我不会在视图中的控制器或独立逻辑中添加这个类决策。相反,我会这样做:

= link_to "?user_id=#{current_user.id}", {:type => "button",
:class => "btn #{@user==current_user ? "btn-primary" : 'btn-default'}"} do
My tickets
end
同样,对于其他两个链接,相同的逻辑只是条件改变,如
@user!=当前用户
@user.blank?

更新

您可以为整个按钮定义一个助手方法,如

def link_to_tickets url , text,active_class_condition
    link_to url, {:type => "button",:class => "btn #{active_class_condition ? "btn-primary" : 'btn-default'}"} do
        text
    end
end
然后在视图中调用此方法

=link_to_tickets "?user_id=#{current_user.id}" , "My Tickets" , @user == current_user

我建议避免在控制器中执行这种逻辑。在您看来,另一个可能的解决方案是:

= link_to "?user_id=#{current_user.id}", {:type => "button", :class => "btn #{link_class(0)}"} do
在你的(无论什么)\u helper.rb中,你可以这样做:

def link_class(index)
  return 'btn-primary' if @user == current_user && index == 0
  return 'btn-primary' if @user && @user != current_user && index == 2
  return 'btn-primary' if index == 1
  'btn-default' 
end
随意使用索引。其余的链接也会这样做,只需传递正确的索引。您还可以使用ors将所有的主返回放在一行中,但这看起来不像示例中那样可读

更新:该函数的简化版本如下:

ba = %w(btn-default btn-primary)
@filter_by_user_id_active = Array.new(3){ba[0]}
def link_class(index)
  return 'btn-primary' if @user && [0,2].include?(index) || index == 1
  'btn-default' 
end

[0,2]。include?(index)是因为这两个都需要@user在场,index==1不需要它。

我建议避免在控制器中执行这种逻辑。在您看来,另一个可能的解决方案是:

= link_to "?user_id=#{current_user.id}", {:type => "button", :class => "btn #{link_class(0)}"} do
在你的(无论什么)\u helper.rb中,你可以这样做:

def link_class(index)
  return 'btn-primary' if @user == current_user && index == 0
  return 'btn-primary' if @user && @user != current_user && index == 2
  return 'btn-primary' if index == 1
  'btn-default' 
end
随意使用索引。其余的链接也会这样做,只需传递正确的索引。您还可以使用ors将所有的主返回放在一行中,但这看起来不像示例中那样可读

更新:该函数的简化版本如下:

ba = %w(btn-default btn-primary)
@filter_by_user_id_active = Array.new(3){ba[0]}
def link_class(index)
  return 'btn-primary' if @user && [0,2].include?(index) || index == 1
  'btn-default' 
end

[0,2].include?(index)是因为这两个都需要@user在场,index==1不需要它。

谢谢,你说得对-我几乎忽略了它可以缩小到你提供的代码。我希望将它转换成更通用的东西,但这至少比我的代码更简洁。我添加了另一种方法来完成同样的任务。你喜欢什么就看你了:)我的观点是这样的,但我觉得太多ruby代码让我觉得不舒服。我会考虑这件事:)谢谢。请看第三条建议。我希望您会喜欢它:)谢谢,您是对的-我几乎忽略了它可以缩小到您提供的代码。我希望将它转换成更通用的东西,但这至少比我的代码更简洁。我添加了另一种方法来完成同样的任务。你喜欢什么就看你了:)我的观点是这样的,但我觉得太多ruby代码让我觉得不舒服。我会考虑这件事:)谢谢。请看第三条建议。我希望你会喜欢:)