假设我有两个模型,Email
和Message
,带有布尔read
属性,为了标记它们,我添加concern
mark_read
和mark_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
答案 0 :(得分:0)
您可以使用read
检查模型是否具有has_attribute?(:read)
属性。从那里调用mark_read
和mark_unread
方法是微不足道的。
@model.mark_read if @model.has_attribute?(:read)
这可能属于你的控制器的set_readable
方法,它仍然需要检查一个相关的参数,比如params[:read]
来调用逻辑。