rails更正用户编辑方法,未定义方法'找到'

时间:2015-10-11 13:04:16

标签: ruby-on-rails

我有一个用户可以在其帐户中添加组织的应用。我希望他们能够编辑他们的组织,并保护其免受任何其他用户的编辑。看起来像这样

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;。

无法弄清楚我在这里做错了什么。

4 个答案:

答案 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}"