Rails - Разрешить доступ к действию контроллера только на стороне сервера

У меня есть каркасы users и projects в моем проекте Rails. У меня также есть контроллер admin и представление, доступное только для пользователей-администраторов. Я хочу, чтобы действия контроллера index и create для моделей users и projects были доступны только для представления admin (используя render :partial > 'index'), но я не хочу, чтобы посетители сайта могли вводить http://railsapp.host/users и получать частичную визуализацию. . Как мне этого добиться?

Чтобы уточнить, моя проблема не в роли пользователя. У меня есть authlogic со всеми помощниками require_admin, но я даже не хочу, чтобы пользователь-администратор мог получить доступ к маршруту index для users непосредственно из браузера. По сути, я хочу ограничить действие контроллера index только кодом представления admin#index следующим образом:

<%= render '/users/index' %>

person pvenky    schedule 03.11.2012    source источник
comment
Самый простой способ описан здесь: guides.rubyonrails.org/.   -  person jdoe    schedule 03.11.2012


Ответы (4)


Лучший способ для рельсов - определить фильтр в контроллере приложений.

 class UsersController < ApplicationController
   before_filter :check_isadmin?, :only => [:create, :index]
 end
 class ProjectsController < ApplicationController
   before_filter :check_isadmin?, :only => [:create, :index]
 end
 class ApplicationControlloller < ApplicationController
   def check_isadmin?
      current_user.admin?
    end
end
person Aayush Khandelwal    schedule 03.11.2012
comment
Спасибо за ответ. Я не был ясен в своем вопросе - я просто отредактировал его. Пожалуйста, смотрите редактирование. - person pvenky; 03.11.2012

Если вы используете роль для другого пользователя, вы можете проверить роль пользователя-администратора, а затем отобразить частично, например:

<% if user.isAdmin? %>
  <%= render 'index' %>
<% end %>
person Thanh    schedule 03.11.2012
comment
Спасибо за ответ. Я не был ясен в своем вопросе - я просто отредактировал его. Пожалуйста, смотрите редактирование. - person pvenky; 03.11.2012
comment
я пока не понимаю, что вы хотите сделать, но если вы хотите установить возможности пользователей, вы можете попробовать Can Может драгоценный камень. - person Thanh; 03.11.2012
comment
Thanh, у меня есть действие контроллера users#index, которое отображает частичное. Но этот фрагмент встроен в представление admin#index. Я не хочу, чтобы кто-нибудь мог ввести https://localhost/users и получить частичное. По сути, мне нужно иметь возможность различать в своем пользовательском контроллере, поступает ли запрос с веб-адреса, введенного непосредственно в браузере, или поступает во время рендеринга действия admin#index. - person pvenky; 03.11.2012

Хорошо, я должен был сказать, что я был относительным новичком в рельсах. Я понял это, хотя. я думал

<%= render '/users/index' %>

на самом деле проходит через код users#index. Я только что понял, что это просто вызов частичного представления без выполнения действия контроллера. Поэтому я просто добавил это в контроллер users

def index
  redirect_to :controller=>'admin', :action=>'index'
end

И это, кажется, достигает цели, которую я искал.

Спасибо за вашу помощь.

person pvenky    schedule 03.11.2012

В дополнение к ответу Аюша Хандельвала, который был мне полезен, before_filter устаревает в Rails 5. Вместо этого используйте before_action.

class UsersController < ApplicationController
   before_action :check_isadmin?, :only => [:create, :index]
end

а в :check_isadmin? перенаправить на другую страницу, если false.

def check_isadmin?
  if current_user == nil || !current_user.admin?
    redirect_to root_path
  end
end 
person Gonzalo    schedule 13.06.2017