2016-07-07 68 views
0

我是新来的铁轨。我有一个相对简单的问题。我定义了一个管理好友请求的控制器。在创建操作中,我检查其他用户是否已经向当前用户发送了好友请求。如果是这样,我跳过创建另一个朋友请求,并简单地执行接受已存在的朋友请求的逻辑。这里是我的代码:Ruby on Rails:我应该将此代码移入模型吗?如果是这样,最好的方法是什么?

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中,同时仍然保持控制器中必要的控制程度?

*我的意思是“好”的是:标准,红宝石十岁上下,导轨十岁上下,很容易辨认,熟悉到多,普及,接受等

还有什么关于我的代码这是不好的做法?

回答

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>

相关问题