【问题标题】:Rails: code in model or controllerRails:模型或控制器中的代码
【发布时间】:2012-11-26 02:05:33
【问题描述】:

这里最好的方法是什么?我正在尝试清理一些代码,我想知道控制器是否是这种逻辑的最佳位置:

if user_signed_in?
  if current_user.try(:admin?)
    @docs = Doc.chronologic.page(params[:page]).per(5)
    @orders = Order.chronologic.page(params[:page]).per(5)
  else
    @docs = Doc.chronologic.where(:user_id => current_user.ftp, :retired => "active").page(params[:page]).per(5)
    @orders = Order.chronologic.where(:user => current_user.ftp).page(params[:page]).per(5)
  end
  respond_to do |format|
    format.html
    format.json { render json: @docs }
  end
else 
  redirect_to new_user_session_path
end

如果有更好的位置,它会在哪里?

谢谢!

编辑:对于像 pdf 这样的方法来说要糟糕得多,它对虾有一行又一行的说明,但我似乎无法让 send_data 从模型中工作。

【问题讨论】:

  • 哪个if 困扰您? user_signed_in? 一个还是admin? 一个?
  • 我想你可以拥有for_user 范围,但在这样的简单案例中这是一个见仁见智的问题。 user_signed_in? 确实应该由 before_filter 处理。并且不需要current_user.try(:admin?),只需current_user.admin? 就足够了,因为user_signed_in? 检查应该避免current_user.nil? 的情况,并且无论如何您都假设!current_user.nil? 用于非管理员用户。
  • 旁注:Ryan Bates 做了an excellent RailsCasts,它展示了一种使用 Prawn 生成 PDF 的好方法,并将代码置于控制器之外。

标签: ruby-on-rails-3 model-view-controller


【解决方案1】:

这基本上是 mu 所说的,但这是我的看法。

在您的应用控制器中:

def require_logged_in
  redirect_to new_user_session_path unless user_signed_in?
end

在你的控制器中

before_filter :require_logged_in

def some_action
  @docs = Doc.chronologic.for_user(current_user).page(params[:page]).per(5)
  @orders = Order.chronologic.for_user(current_user).page(params[:page]).per(5)
  respond_to do |format|
    format.html
    format.json { render json: @docs }
  end
end

在您的 Doc 模型中

scope :for_user, lambda do |user|
  where(:user_id => user.ftp, :retired => "active") unless user.admin?
end

在您的 Order 模型中也有类似的东西。

根据您的编辑,绝对不要在您的模型中使用send_data

【讨论】:

  • 这是一个很好的解决方案。干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 2010-11-13
  • 1970-01-01
相关资源
最近更新 更多