2015-10-11 39 views
0

我有一個應用程序,用戶可以在其中添加一個組織到他們的帳戶。我希望他們能夠編輯其組織,並防止其被任何其他用戶編輯。它看起來像這樣導軌正確的用戶編輯方法,未定義的方法'找到'

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我收到一個未定義的方法'find_by'。

無法弄清楚我在這裏做錯了什麼。

回答

1

如果organization是一條記錄,它將不會響應find_by

此外,你正在檢查如果organizationnil後調用一個方法。此時已爲時過晚。如果它是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 
+0

這似乎是工作,但由於某種原因,我的'PARAMS [: id]'是一個字符串,我的'current_user.organization.id'是一個int。所以它工作,如果我使用current_user.organization && current_user.organization.id == params [:id] .to_f'任何想法爲什麼? – Mischa

+0

剛剛發現如果'current_user.organization = nil'調用'.id'會產生另一個錯誤 – Mischa

+0

@Mischa:對。你是對的。 Ruby中的比較是類型敏感的。然而,如果它是'nil',則評估永遠不會超過第一個'current_user.organization'檢查。 – Drenmi

0

爲組織和用戶之間的關係是一個對一個,你不需要調用find@organization = current_user.organization就夠了。

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。

+0

嘗試了兩個,同樣的錯誤 – Mischa

+0

對不起。我已經更新了我的答案,僅供所有者驗證組織。 – akbarbin

0

處理此問題的有效方法是按如下方式在組織控制器中實現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}"