【问题标题】:DRYing up respond_to code in Rails在 Rails 中干燥 respond_to 代码
【发布时间】:2013-07-31 08:31:12
【问题描述】:

我有几个动作(我们称它们为 action_a、action_b 等)

在每个操作中,我想检查用户是否已登录,如果没有respond_to 块,如下所示

 format.js {
          if current_user.nil?
            render partial: 'some_partial', handler: [:erb], formats: [:js]
          end
        }

对于一个动作来说这很好,但对于很多动作来说就不行了,因为会有很多重复的代码会做完全相同的事情,它不是很漂亮或可维护

有没有办法把它放在某个地方,这样我就可以重用这段代码,而不是在每个需要的操作中重写它?

【问题讨论】:

  • 非常简单的解决方案您可以在控制器def responsed_to add your code of respond_to end 中编写一个方法并在控制器操作中调用它使其成为私有方法

标签: ruby-on-rails ruby ruby-on-rails-3 dry respond-to


【解决方案1】:

使用before_filter (rails <4.0) or before_action (rails 4.0)

class YourController < ApplicationController
  before_filter :check_user

  ...
  your actions
  ...

  private
    def check_user
      redirect_to sign_in_path if current_user.nil?
    end
end

或者,如果您想要特定的操作并做出响应,请使用 around_action(过滤器):

class YourController < ApplicationController
  around_action :check_user

  ...
  your actions
  def show
    @variable = Variable.last
  end
  ...

  private
    def check_user
      yield #(you normal action without js respond)
      format.js {
        if current_user.nil?
          render partial: 'some_partial', handler: [:erb], formats: [:js]
        end
      }
    end
end

【讨论】:

  • 我可以在 before_filter 中有一个 js 响应(用户没有登录吗?)
【解决方案2】:

阅读Responders。这些是为了帮助解决这个问题。

您的具体问题是过滤器通常用于什么。见this Section on Filters in the Action Controller Guide

更一般地说,这只是 ruby​​ 代码,因此您可以将所有内容重构为方法:

def do_stuff_with(partial_name, format)
  if current_user.nil?
    render partial: partial_name, handler: [:erb], formats: [format]
  end
end


format_js { do_stuff_with('some_partial', :js) }

【讨论】:

  • 我可以在 before_filter 中有一个 js 响应(用户没有登录吗?)
猜你喜欢
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 2014-08-03
  • 1970-01-01
  • 2010-11-26
  • 2013-09-16
  • 1970-01-01
相关资源
最近更新 更多