Почему методы в файле помощника не доступны с контроллера в рельсах? - PullRequest
0 голосов
/ 12 декабря 2011

Существует метод has_edit_right?, определенный в файле Customers_helper.rb. Метод должен быть доступен как контроллеру, так и его представлению. 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)>'

Есть мысли о проблеме? Спасибо.

1 Ответ

2 голосов
/ 12 декабря 2011

Помощники для представлений, это их точка зрения. Они не должны быть доступны в контроллере, они специально предназначены для отработки логики многократного использования. Если вам нужен метод, доступный как для контроллера, так и для его представлений, определите метод 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 %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...