我有一个模型,报告,即多晶型。 所以在我的网站很多itens可能有很多的吧。

和我想有一个通用的控制器张贴。 它的一个非常简单的模型,只具有文本消息和关联。

在我的路线,即时通讯做这样的事情。

map.resources :users, :has_many => [ :reports ]
map.resources :posts, :has_many => [ :reports ]

但在我reports_controller,我想摆脱其来自的关系。

像:

before_filter :get_reportable

def get_reportable
   reportable = *reportable_class*.find params[:reportable_id]
end

这可能吗?

我怎么能得到reportable_class和reportable_id?

我可以得到PARAMS [:USER_ID]当它来自用户控制器,或PARAMS [:POST_ID]当谈到从帖子。我可以做的情况下,与所有的关系,但它似乎没有一个干净的解决方案在所有...

具有多态关联将是最好的,是否有任何如何?

有帮助吗?

解决方案

如果你有一个控制器,通过两个不同的路径处理请求,那么你需要使它意识到它会被称为上下文。你经常会看到很多的代码看起来是这样的:

before_filter :load_reportable

def load_reportable
  if (params[:user_id])
    @user = User.find(params[:user_id])
    @reportable = @user
  elsif (params[:post_id])
    @post = Post.find(params[:post_id])
    @reportable = @post
  end
rescue ActiveRecord::RecordNotFound
  render(:partial => 'not_found', :status => :not_found)
  return false
end

由于您使用多态关联,你可能能够做这样的事情,而不是:

before_filter :load_reportable

def load_reportable
  unless (@reportable = @report.reportable)
    # No parent record found
    render(:partial => 'not_found', :status => :not_found)
    return false
  end

  # Verify that the reportable relationship is expressed properly
  # in the path.

  if (params[:user_id])
    unless (@reportable.to_param == params[:user_id])
      render(:partial => 'user_not_found', :status => :not_found)
      return false
    end
  elsif (params[:post_id])
    unless (@reportable.to_param == params[:post_id])
      render(:partial => 'post_not_found', :status => :not_found)
      return false
    end
  end
end

使用这种方法,在这里有一个控制器,该控制器有两个完全不同的路由的麻烦是,生成错误消息,例如“用户未找到”与“后未找到”。这可能会非常棘手得到正确的,如果你不从用户:: BaseController继承,例如。

在许多情况下,更容易产生两个独立的“报告”控制器,诸如用户/报告和文章/报告,其中任何通用的功能是从一个模块导入。这些控制器通常从基站控制器,其执行加载操作和错误处理继承。主控制器还可以建立布局,网页标题等,而无需重新实现此功能对于每个子资源控制器。

另一种方法是去耦的报告,并将它作为运行其自己的控制器,其中的“报告”的记录的关系是大多不相关的。

其他提示

或尝试的是:

before_filter :get_reportable

def get_reportable
  params.each do |name, value|
    if name =~ /(.+)_id$/
      @reportable = $1.classify.constantize.find(value)
    end
  end
end

这是要通过所有的PARAMS,并试图找到一个_id结尾,然后获取该部分之前找到相关记录。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top