Rails / Angular: нет подходящих маршрутов [GET]

0

Я слежу за учебником Railscast raffler и пытаюсь создать новое представление в моем контроллере пользователей, которое будет использовать Angular для отображения списка всех пользователей с ролью "пользователь" из таблицы пользователя (я еще не реализовал это), а затем случайным образом выберите один из них, чтобы стать победителем (поле победителя будет логически проверено на значение true). На данный момент я решил добавить новый метод в контроллер пользователей, "лотерею" и, конечно, соответствующее представление, чтобы показать это. Тем не менее, когда я открываю пользователей/лотерею, я получаю следующую ошибку, и, похоже, я следовал правильному пути определения маршрута до ресурсов:

No route matches [GET] "/raffle"

(Возможно, есть более оптимальные способы сделать это, но моя просьба заключается в том, что я, пожалуйста, использую угловые для достижения этого, потому что мне действительно нужно это изучить.)

Вот мои маршруты.rb:

Rails.application.routes.draw do

  resources :scholarships
  devise_for :users, :controllers => { registrations: 'registrations' }
  get 'users/raffle' => 'users#raffle'
  resources :users

  get 'static_pages/instructions'

  get 'static_pages/about'

  get 'static_pages/contact'

  get 'static_pages/landing_page'

  root 'static_pages#landing_page'

end

Вот мой пользовательский контроллер:

class UsersController < ApplicationController
  include Devise::Controllers::Helpers
  before_action :authenticate_user!
  #Users who are not signed in cannot view users list
  before_action :set_user, only: [:show, :edit, :update, :destroy]
  load_and_authorize_resource
  respond_to :html, :json, only: [:raffle]

  # GET /users
  # GET /users.json
  def index
    @users = User.all
  end

  def raffle
  end

  # GET /users/1
  # GET /users/1.json
  def show
  end

  # GET /users/new
  def new
    @user = User.new
  end

  # GET /users/1/edit
  def edit
    @user = current_user
  end

  # POST /users
  # POST /users.json
  def create
    @user = User.new(user_params)

    respond_to do |format|
      if @user.save
        format.html { redirect_to @user, notice: 'User was successfully created.' }
        format.json { render :show, status: :created, location: @user }
      else
        format.html { render :new }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /users/1
  # PATCH/PUT /users/1.json
  def update
    respond_to do |format|
      if @user.update(user_params)
        format.html { redirect_to @user, notice: 'User was successfully updated.' }
        format.json { render :show, status: :ok, location: @user }
      else
        format.html { render :edit }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /users/1
  # DELETE /users/1.json
  def destroy
    @user.destroy
    respond_to do |format|
      format.html { redirect_to users_url, notice: 'User was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_user
      @user = User.find(params[:id])
    end

    #Never trust paramaters from the scary internet, man.
    def user_params
      params.require(:user).permit(:first_name, :last_name, :email)
    end
end

Мой файл javascript с угловым:

var rafflerApp = angular.module('rafflerApp', ["ngResource"]);

rafflerApp.controller('rafflerController', function($scope, $resource) {
        User = $resource("/users/:id", {id: "@id"},{update: {method: "PUT"}})
        $scope.users = User.query()

        //Draw a New Winner
        $scope.drawWinner = function(){
            pool=[];
            angular.forEach($scope.users,function(user){
                if(!user.winner){
                    pool.push(user) ;
                }
            });
            if(pool.length >0) {
                user = pool[Math.floor(Math.random()*pool.length)];
                user.winner = true;
                user.$update();
                $scope.lastWinner = user;
            }
        }

});

Мой файл raffle.html.erb:

<% if user_signed_in? && current_user.role == "Admin" %>

    <h1 class="center">Winner Raffler</h1>
    <h4 class="center">To select a winner for this year scholarship, simply click "choose winner" below</h4>

    <div ng-controller="rafflerController"> 
        <ul>
            <li ng-repeat="user in users">
                {{user.first_name}}
                <span ng-show="user.winner">Winner</span>
            </li>
        </ul>

    </div>
<button ng-click="drawWinner()">Draw Winner</button>
<% end %>

Схема пользователей:

  create_table "users", force: :cascade do |t|
    t.string   "first_name"
    t.string   "last_name"
    t.datetime "created_at",                             null: false
    t.datetime "updated_at",                             null: false
    t.string   "email",                  default: "",    null: false
    t.string   "encrypted_password",     default: "",    null: false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          default: 0,     null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.inet     "current_sign_in_ip"
    t.inet     "last_sign_in_ip"
    t.integer  "role",                   default: 1
    t.boolean  "winner",                 default: false
    t.integer  "scholarship_id"
  end

Заранее спасибо.

1 ответ

0

Измените ваши маршруты.rb следующим образом:

Rails.application.routes.draw do

  # ...

  # get 'users/raffle' => 'users#raffle'  <-- remove this line
  resources :users do
    get :raffle, on: :collection
  end

  #...

end
  • 0
    Добавил, что и он все равно выкладывает ту же ошибку

Ещё вопросы

Сообщество Overcoder
Наверх
Меню