Итак, сейчас я работаю над книгой по разработке на Rails и столкнулся с проблемой. У меня есть контроллер «Пользователи» с несколькими действиями. Одно из действий, которое я определил в нем, - «следовать». Однако всякий раз, когда я пытался связать это в моем представлении с помощью помощника rails, он сообщает мне, что этот маршрут не определен. Вот как выглядит мой контроллер:

class UsersController < ApplicationController   
def follow
    @user = User.find(params[:id])
    if current_user.follow!(@user)
        redirect_to @user, notice: "Follow successful!"
    else 
        redirect_to @user, alert: "Error following."
    end
end

Я пробовал связать это двумя способами. Вот первое:

<%= link_to "Follow", {action: 'follow'}, class: 'btn btn-default' %>

Это приводит к ошибке: "Нет совпадений маршрута {: action =>" follow ",: controller =>" users ",: id =>" 2 "}"

Вот второй способ:

<%= link_to "Follow", follow_user_path(@user), class: 'btn btn-default' %>

Это приводит к сообщению: "неопределенный метод` follow_user_path 'для # <#: 0x007f8fb76bd570> "

Даже когда я запускаю rake routes, путь там не отображается, хотя я определил в моем файле routes.rb

resources :users

Я сейчас в полной растерянности. Что я делаю не так?

1
Joshua E 19 Фев 2016 в 05:34

2 ответа

Лучший ответ

Вы не определили маршруты. resources :users будет определять только маршруты RESTful, которые не охватывают follow. Чтобы скрыть это, вы можете написать это так:

resources :users do
  member do
    get :follow
  end
end

Он будет генерировать такие URL-адреса, как:

/users/USER_ID/follow

Затем из представления вы можете ссылаться на него следующим образом:

<%= link_to "Follow", follow_user_path(USER_ID), class: 'btn btn-default' %>

Обязательно замените USER_ID фактическим идентификатором пользователя!

2
Babar Al-Amin 19 Фев 2016 в 02:41

Насколько я понимаю, похоже, что нет маршрута следования, поэтому внутри вашего routes.rb вам нужно поместить что-то вроде этого: get «/ follow», to: «users # follow»

-1
Chris Ma 19 Фев 2016 в 02:41