Ruby on Rails:我应该将此代码移入模型吗?如果是这样,最好的方法是什么?

时间:2016-07-07 18:58:38

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

我是铁杆新手。我有一个相对简单的问题。我已经定义了一个管理好友请求的控制器。在创建操作中,我检查其他用户是否已向当前用户发送了朋友请求。如果是这样,我跳过创建另一个朋友请求并简单地执行接受已存在的朋友请求的逻辑。这是我的代码:

class FriendRequestsController < ApplicationController
  before_filter :authenticate_user!

  def create
    current_user_id = current_user.id;
    recipient_id = params[:recipient_id].to_i;

    # check if the other person has already sent a friend request
    unless (existing_request = FriendRequest.find_by(
        :sender_id => recipient_id,
        :recipient_id => current_user_id)).nil?
      accept(existing_request)
      return redirect_to current_user
    end

    request = FriendRequest.new(:sender_id => current_user_id,
                                :recipient_id => recipient_id)
    if request.save
      flash[:notice] = "Sent friend request."
    else
      flash[:errors] = request.errors.full_messages
    end
    redirect_to users_path

  end

上面的某些逻辑应该进入FriendRequest模型吗?如果是这样,多少钱?有没有一种好的方法我可以将调用FriendRequest.new和request.save转移到模型中,同时仍然保持控制器中必要的控制程度?

*我的意思是&#34;好&#34;是:标准,ruby-ish,rails-ish,易于识别,熟悉,流行,接受等。

我的代码还有什么其他的做法很糟糕吗?

1 个答案:

答案 0 :(得分:0)

这里可以稍微改进一下:

 unless (existing_request = FriendRequest.find_by(
        :sender_id => recipient_id,
        :recipient_id => current_user_id)).nil?

相反,您可以在好友请求模型中编写一个方法:

def self.find_matching_request(sender_id, receiver_id)
  find_by(sender_id: sender_id, receiver_id: receiver_id)
end

对于这个例子,这并没有真正为你节省许多击键次数,但如果你想将逻辑移出控制器并进入模型,这就是你要做的事情。基本上创建一个方法,它是数据库交互逻辑的包装器。大部分数据库交互应该在模型中完成,尽管许多人最终在控制器中完成它。

然后在控制器中:

existing_request = find_matching_request(current_user_id, recipient_id) 
if existing_request
  accept(existing_request)
  redirect_to current_user
end

在使用看起来像反模式的unless <some_val>.nil?之前,除非您出于某种原因对falsenil进行不同的处理。更典型的是if <some_val>