2011-12-12 45 views
0

在customers_helper.rb文件中定義了一個方法has_edit_right?。該方法需要由控制器及其視圖訪問。 rspec返回NoMethodError:爲什麼助手文件中的方法不能從控制器中導出?

1) CustomersController GET customer page 'edit' should be successful if current user is the owner of the customer 
    Failure/Error: post 'edit', :id => customer.id, :customer => {:name => "name changed"} 
    NoMethodError: 
     undefined method `has_edit_right?' for #<CustomersController:0x3df6980> 
    # ./app/controllers/customers_controller.rb:40:in `edit' 
    # ./spec/controllers/customers_controller_spec.rb:87:in `block (3 levels) in <top (required)>' 

有關此問題的任何想法?謝謝。

回答

2

助手是意見,這是他們的觀點。它們不應該在控制器中可用,它們專門用於提煉可重用的視圖邏輯。如果您需要控制器及其視圖均可用的方法,請在控制器中定義protected方法,並通過helper_method將其提供給視圖。

在此示例中,控制器中定義的方法has_edit_right?也可用於視圖。

# app/controllers/posts_controller.rb 

class PostsController < ApplicationController 

    helper_method :has_edit_right? 

    # ... 

    def edit 
    raise "Access Denied" unless has_edit_right? 
    # ... 
    end 

    protected 

    def has_edit_right? 
    current_user.admin? 
    end 
end 

# app/views/posts/show.html.erb 

<% if has_edit_right? %> 
    <%= link_to "Edit Post", edit_post_path(@post) %> 
<% end %> 
+0

方法has_edit_right?需要被視圖和控制器訪問。 – user938363

+0

然後讓它成爲你的控制器或者'ApplicaitonController'的一個方法,並且通過'helper_method:has_edit_right?'將它提供給你的視圖' – meagar

+0

查看更新,我誤解了:通過'helper_method'完成控制器的一個方法,不是'幫手'。 – meagar

相關問題