我有一个用户可以在其帐户中添加组织的应用。我希望他们能够编辑他们的组织,并保护其免受任何其他用户的编辑。看起来像这样
class OrganizationsController < ApplicationController
before_action :correct_user, only: [:edit, :update, :destroy]
private
def correct_user
@organization = current_user.organization.find_by_id(params[:id])
redirect_to root_url if @organization.nil?
end
end
模型
class Organization < ActiveRecord::Base
belongs_to :user
validates :user_id, presence: true
end
class User < ActiveRecord::Base
has_one :organization
end
通过Rspec,我可以找到current_user.organization的记录。但是,当我调用current_user.organization.find_by时,我收到一个未定义的方法&#39; find_by&#39;。
无法弄清楚我在这里做错了什么。
答案 0 :(得分:1)
如果organization
是单个记录,则不会回复find_by
。
此外,您在调用方法后检查organization
是否为nil
。这时太晚了。如果是nil
,并且您尝试在其上调用find_by
,那么您将获得NoMethodError
。
而是试试这个:
def correct_user
if current_user.organization && current_user.organization.id == params[:id].to_i
@organization = current_user.organization
else
redirect_to root_url
end
end
答案 1 :(得分:0)
只要组织与用户之间的关系是一对一的,您就不需要致电find
。 @organization = current_user.organization
就足够了。
答案 2 :(得分:0)
对我之前的回答感到抱歉。我已经修改过了。
def correct_user
@organization = Organization.find_by(id: params[:id])
if current_user.id != @organization.user_id
redirect_to root_url
end
end
当前用户不是组织的所有者时,将被重定向到root_url。
答案 3 :(得分:0)
处理此问题的有效方法是在Organization控制器中实现correct_user方法,如下所示。
# Confirms the correct user.
def correct_user
@user = User.find(params[:user_id])
redirect_to(root_url) unless current_user?(@user)
end
调试助手
在控制器中添加此项以在运行时查看哈希的内容
flash[:info] = "Hash: #{params}"