2015-08-10 6 views
4

Мне удалось создать приложение, которое работает только для регистрации и входа в систему. В настоящее время я разрешаю пользователям активировать учетную запись электронной почты (следуя этому руководству: https://www.railstutorial.org/book/account_activation_password_reset и «rails генерирует контроллер AccountActivations --no-test-framework»), но я хочу, чтобы администратор мог активировать или деактивировать пользователей. В моей модели пользователей, мне удалось определить два метода:Разрешить администратору активировать или деактивировать пользователей - Rails

def activate_account! 
    update_attribute :is_active, true 
end 

def deactivate_account! 
    update_attribute :is_active, false 
end 

И на моих пользователей частичный вид, мне удалось

<% if current_user.admin? && !current_user?(user) %> 
    <%= button_to "Deactivate", user, data: { confirm: "Are you sure?" } %> 
<% end %> 

Мои маршруты выглядеть следующим образом:

get 'password_resets/new' 
get 'password_resets/edit' 
root    'static_pages#home' 
get 'help' = 'static_pages#help' 
get 'about' = 'static_pages#about' 
get 'contact' = 'static_pages#contact' 
get 'signup' = 'users#new' 
get 'login' = 'sessions#new' 
post 'login' = 'sessions#create' 
delete 'logout' = 'sessions#destroy' 
resources :users 
resources :account_activations, only: [:edit] 
resources :password_resets,  only: [:new, :create, :edit, :update] 

проблема в том, что я не знаю, как действовать дальше. Я не хочу использовать Devise или CanCan, потому что, как новичок, я хочу знать, как это сделать вручную. Помогите мне в реализации активации и деактивации пользователей из приложения (администратор может только это).

Here is my app.

ответ

4

Ok, сначала прочтите chapters 9 and 10 из Rails Tutorial Hartl в.

Сложение и флаг администратора для пользователей

rails g migration add_admin_to_users admin:boolean 

Это даст вам .admin? «бесплатно», как Active Record будет генерировать этот метод.

И я бы написать свою кнопку, как этот

<% if current_user.admin? && @user != current_user %> <%=link_to "deactivate", deactivate_path(user_id: @user), method: :post, data: { confirm: "Are you sure?" } %> <% end %> 

Тогда в контроллере:

def deactivate 
    user = User.find(params[:user_id]) 
    if current_user.admin? 
    user.deactivate_account! 
    redirect_to users_path 
    else 
    redirect_to :back 
    end 
end 

И в маршрутах, что-то вроде:

post "/deactivate", to: "users#deactivate" 

Во всяком случае, я 'давая вам приблизительный проводник, но читайте учебник Хартла, так как ваш прецедент почти покрыт там.

Удачи вам!

+0

Hi, Chase! Большое спасибо .. Уже прочитали эти главы.они были прекрасны! Тем не менее, есть проблемы. Тем не менее, я думаю, что это проблема маршрутизации, так как приложение теперь имеет кнопку для деактивации и подтверждения, но не выполняет действие. Я также сменил контроллер на: 'def deactivate User.find (params [: id]). Deactivate flash [: success] =" Пользователь деактивирован " redirect_to users_url end' и определено первое' before_action: admin_user, только: [: destroy,: deactivate] '. Что может быть неправильным? – ClauCece

+0

Какая ошибка вы получаете? Если вы можете добавить свою ошибку, я отредактирую свой ответ, чтобы обратиться к ней. –

+0

На веб-странице: «Извините, но что-то пошло не так». В журналах: '... lib/action_dispatch/templates/rescues/routing_error.html.erb внутри rescues/layout' – ClauCece

1

Согласно Rails конвенции:

PUT is used for updating an existing resource

POST is used for creating a new resource

Таким образом, вы должны сделать это PUT запрос, а не POST как это обновление user запись.

Вы должны определить свой маршрут, как это:

put 'deactivate/:id(.:format)', :to => 'users#deactivate', :as => :deactivate_user 

И, в вашем user частичное:

<%=link_to "Deactivate", deactivate_user_path(user), method: :put, data: { confirm: "You sure?" }%> 

Все должно работать с существующим кодом.

+0

:) Спасибо! – ClauCece