ruby-on-rails - 在多个 Controller 中重构 "render format"

标签 ruby-on-rails ruby ruby-on-rails-3 refactoring controller

所以我在多个 Controller 中有一个 View 方法,它们看起来几乎完全相同:

  def show
    show! do |format|
      format.json do
        if @text.activated?
          @text.log
          render_for_api :texts_all, :json => @text
        else
          render :nothing => true
        end
      end
      format.pdf do
        pdf = QrPdf.new(@text)
        send_data pdf.render, filename: "text_#{@text.id}.pdf", type: "application/pdf"
      end
    end
  end

此模型不同,但它们都具有此方法中使用的相同属性(activatedlogid )。我还可以将 render_for_api 给定的哈希值从当前的 texts_alldocuments_all 等更改为到处都相同的哈希值。

有没有办法在多个模型中使用此代码而不需要大量重复?

我很感谢每一个提示! 特别是我发现很难处理 do |format| block 。但我也不确定将代码放在哪里以及如何将其与不同类型的模型一起使用。

谢谢。

最佳答案

如果模型确实是通用的:

def show
  show_model @text
end

我不确定 show! 是什么,但你可以弄清楚这部分。粗略(未经测试):

def show_model(obj)
  show! do |f|
    f.json do
      return render(:nothing => true) unless obj.activated?

      obj.log
      render_for_api :texts_all, :json => obj
    end

    f.pdf do
      opts = { filename: "text_#{obj.id}.pdf", type: "application/pdf" }
      send_data QrPdf.new(obj).render, opts
    end
  end
end

show_model 所在的位置而言,我倾向于将类似的东西放入基本 Controller 中,或者作为 mixin,但可能有更好的选择。由于我通常有一个基本 Controller ,因此很容易将其保留在那里。

关于ruby-on-rails - 在多个 Controller 中重构 "render format",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8962394/

相关文章:

mysql - 轨道 3 : Search in a query result

ruby-on-rails - Rails 3 无效的多字节字符 (US-ASCII)

javascript - before_update 无法与 Ajax、Rails 4 一起正常工作

Ruby:在运行时保存类/方法定义

ruby-on-rails - 如何将一维ruby数组组合成二维数组?

Javascript 更改事件未在 cucumber 测试中触发

mysql - 使用现有的 Mysql 数据库构建 Ruby on Rails 应用程序

ruby-on-rails - 具有绑定(bind)的多个并发 Rails 服务器

ruby-on-rails - 在 Rails 中设置用户和赏金之间的关联

ruby-on-rails - 在 Ruby On Rails 中使用seeds.rb 中的方法