我是铁杆新手。我有一个相对简单的问题。我已经定义了一个管理好友请求的控制器。在创建操作中,我检查其他用户是否已向当前用户发送了朋友请求。如果是这样,我跳过创建另一个朋友请求并简单地执行接受已存在的朋友请求的逻辑。这是我的代码:
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,易于识别,熟悉,流行,接受等。
我的代码还有什么其他的做法很糟糕吗?
答案 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?
之前,除非您出于某种原因对false
和nil
进行不同的处理。更典型的是if <some_val>