在由不同模型使用的单用途控制器中自动设置实例变量

时间:2016-07-09 18:11:23

标签: ruby-on-rails ruby

假设我有两个模型,EmailMessage,带有布尔read属性,为了标记它们,我添加concern mark_readmark_unread patch成员路由到ReadablesController

我想这样做set_readable是自动的,不需要我手动查询参数,而只是适用于具有read属性的所有模型。有没有一种简单的方法可以实现这一目标?

class ReadablesController < ApplicationController
  before_action :set_readable

  ...

  def mark_read
    @readable.read = true
    @readable.save

    flash[:notice] = "#{@readable.class.to_s} marked read."
    redirect_to :back
  end

  def mark_unread
    @readable.read = false
    @readable.save

    flash[:notice] = "#{@readable.class.to_s} marked unread."
    redirect_to :back
  end

  private

  def set_readable
    throw "error" if params[:email_id].present? && params[:message_id].present?

    @readable = Email.find(params[:email_id]) if params[:email_id].present?
    @readable = Message.find(params[:message_id]) if params[:message_id].present?
  end
end

1 个答案:

答案 0 :(得分:0)

您可以使用read检查模型是否具有has_attribute?(:read)属性。从那里调用mark_readmark_unread方法是微不足道的。

@model.mark_read if @model.has_attribute?(:read)

这可能属于你的控制器的set_readable方法,它仍然需要检查一个相关的参数,比如params[:read]来调用逻辑。