2015-07-19 126 views
0

如何在模型內部訪問控制器的實例變量?在模型中訪問控制器的實例變量

在這個例子中,我想訪問模型中的實例變量@user

柱控制器

class PostController < ApplicationController 
    def destroy 
    @user = User.find(params[:user_id]) 
    post = Post.find(params[:id]) 
    end 
end 

郵政型號

class Post < ActiveRecord::Base 
    belongs_to :user 

    before_destroy :check_if_owned_by_user 
    if self.user != @user 
     return false 
    end 
    end 
end 
+0

可能重複(http://stackoverflow.com/questions/2419120/ruby- on-rails-access-controller-variable-from-model) – Pavan

回答

0

你不能在後模型訪問@user。回調不會自動觸發參數。您必須從控制器明確調用該方法。喜歡這個。

class PostController < ApplicationController 
    def destroy 
    @user = User.find(params[:user_id]) 
    post = Post.find(params[:id]) 
    if post.check_if_owned_by_user(@user) 
     #delete it 
    end 
    end 
end 

class Post < ActiveRecord::Base 
    belongs_to :user 

    def check_if_owned_by_user(user) 
    self.user == user 
    end 
end 
+0

似乎很危險依靠每一個控制器來記住包含該條件 - 如果可能,我寧願將它保留在模型中 –

+0

您可能需要更改邏輯以允許只有那些有權訪問的用戶才能刪除。還包括條件。但根據我的知識,我不認爲你可以傳遞參數給回調... – Athar

+0

我會實現它作爲一個before_action到PostsController。 –

0

檢查當前用戶是否被允許刪除的對象是授權的關注,並應您的授權方法(如康康舞)中進行處理。

如果您必須手動處理它,請考慮使用服務對象來實現相同。回調一旦累積就是凌亂的事情。

class DestroyPost 
    def initialize post, user 
    @post = post 
    @user = user 
    end 

    def call 
    return false unless @post.user = @user 
    @post.destroy 
    end 
end 

你會打電話DestroyPost.new(@post, @user).call控制器,而不是@post.destroy

[Ruby on Rails的 - 從模型訪問控制器變量]的
相關問題