嵌套条件的替代方案Rails控制器

时间:2014-04-29 19:39:14

标签: ruby-on-rails controller

我有一个以网格格式显示信息的页面。每个网格图块中显示的内容取决于:

  • 用户是否已登录
  • 用户点击的内容
  • 其他因素

我正在使用AJAX向控制器发送用户点击的内容并获取新内容。

# Simplified pseudocode example
def get_tile_content
    tile_objects = []

    if current_user.present?
      if params[:user_selected_content] == 'my stuff'
        tile_objects = [... some model scope source here...]
      elsif params[:user_selected_content] == 'new stuff'
        tile_objects = [... some model scope source here...]
      elsif params[:user_selected_content] == 'other stuff'
        tile_objects = [... some model scope source here...]
      end
    else
      tile_objects = [... some model scope source here...]
    end

    render :json => tile_objects.to_json || {}
end

有关如何以不同方式处理此问题的任何想法?我尝试将复杂性转移到模型上,但我发现它的可读性更低,更难以弄清楚发生了什么。

1 个答案:

答案 0 :(得分:1)

看起来像是case声明的一个体面的案例(......看看我在那里做了什么?; P)

def get_tile_content
    tile_objects = []

    if current_user.present?
      tile_objects = case params[:user_selected_content]
        when 'my stuff'    then Model.my_stuff
        when 'new stuff'   then Model.new_stuff
        when 'other stuff' then Model.other_stuff
      end
    else
      tile_objects = Model.public_stuff
    end

    render :json => tile_objects.to_json || {}
end

有时需要个案陈述。真的不能说这是不是因为我无法看到你的应用程序的更大设计,但这至少会将它清理一点,更少,更容易阅读,取决于你的风格偏好。

如果您愿意,可以将case语句包装到自己的方法中,并将参数的值传递给它。

另一个样式点是你通常不会在ruby方法名称的开头使用get_。假设.blah=是一个设定者而.blah是一个吸气剂,因此.get_blah是多余的。