【问题标题】:No route matches [GET] after post validation error Rails 4验证后错误Rails 4后没有路线匹配[GET]
【发布时间】:2016-03-20 17:35:28
【问题描述】:

我正在根据来自其他选择字段的选择使用 AJAX 动态更新我的表单字段。第一次进入时一切正常。虽然,在提交带有验证错误的表单并使用 render 'new' 后,我收到了路由错误。我在资源上方添加了 update_players 的路线(见下文)。我认为我的路线有问题。

这是我的参考:https://kernelgarden.wordpress.com/2014/02/26/dynamic-select-boxes-in-rails-4/

config/routes.rb:

...
    get 'games/update_players', as: 'update_players'
    resources :games
...

倾斜的路线:

...
  update_players GET    /games/update_players(.:format) games#update_players
           games GET    /games(.:format)                games#index
                 POST   /games(.:format)                games#create
        new_game GET    /games/new(.:format)            games#new
       edit_game GET    /games/:id/edit(.:format)       games#edit
            game GET    /games/:id(.:format)            games#show
                 PATCH  /games/:id(.:format)            games#update
                 PUT    /games/:id(.:format)            games#update
                 DELETE /games/:id(.:format)            games#destroy
...

games_controller.rb

  def show
    @game = Game.find(params[:id])
  end  

  def new
    @users = User.all
    @game = Game.new
  end

  def create
    @game = Game.new(game_params)
    if @game.save
      flash[:success] = 'Game Saved!'
      redirect_to current_user
    else
      flash.now[:alert] = 'Game did not save'
      @users = User.all
      render 'new'
    end
  end
...
  def update_players
    @users = Group.find(params[:group_id]).users
    respond_to do |format|
      format.js
    end
  end

assets/javascripts/games.coffee:

update_players = ->
  $.ajax 'update_players',
    type: 'GET'
    dataType: 'script'
    data: {
      group_id: $("#groups-select option:selected").val()
    }
    error: (jqXHR, textStatus, errorThrown) ->
      console.log("AJAX Error: #{textStatus}")
    success: (data, textStatus, jqXHR) ->
      console.log("Dynamic player select OK!")

$(document).on 'ready page:load', update_players
$(document).on 'change', '#groups-select', update_players

views/games/update_players.js.coffee:

$("#players-select").empty()
  .append("<%= escape_javascript(render(:partial => "players_in_group_list")) %>")

在创建时呈现“新”后,这是我收到的错误:

Started GET "/update_players?group_id=1&_=1458493122921" for ::1 at 2016-03-20 10:58:43 -0600

ActionController::RoutingError (No route matches [GET] "/update_players"):

下面发布的解决方案

【问题讨论】:

    标签: ruby-on-rails ajax ruby-on-rails-4 routing coffeescript


    【解决方案1】:

    根据您的路线,ajax 中的 url 应该是:

    update_players = ->
      $.ajax 'games/update_players',
      type: 'GET'
        dataType: 'script'
        data: {
          group_id: $("#groups-select option:selected").val()
        }
        error: (jqXHR, textStatus, errorThrown) ->
          console.log("AJAX Error: #{textStatus}")
        success: (data, textStatus, jqXHR) ->
          console.log("Dynamic player select OK!")
    
    $(document).on 'ready page:load', update_players
    $(document).on 'change', '#groups-select', update_players
    

    或者改变你的路线:

    get 'update_players', to: 'games#update_players' as: 'update_players'
    

    ajax:

     update_players = ->
          $.ajax 'update_players',      
         type: 'GET'
        dataType: 'script'
        data: {
          group_id: $("#groups-select option:selected").val()
        }
        error: (jqXHR, textStatus, errorThrown) ->
          console.log("AJAX Error: #{textStatus}")
        success: (data, textStatus, jqXHR) ->
          console.log("Dynamic player select OK!")
    
    $(document).on 'ready page:load', update_players
    $(document).on 'change', '#groups-select', update_players
    

    同时修正引号:

    $("#players-select").empty().append("<%= escape_javascript(render(:partial => 'players_in_group_list')) %>")
    

    【讨论】:

    • 这让我有了更好的理解,虽然并不能完全解决问题。因为 $.ajax 调用发生在 games.coffee 中,所以它会在第一次进入时将 games/ 添加到路由中。再一次,在出错时(在渲染“新”之后)它不再预先设置并让我留下丢失的路线“/update_players”。如果我将 'games/' 添加到 ajax 调用中,它会在错误之后起作用,但在第一次进入时不起作用。将路由更改为get 'update_players', as 'update_players' 会出现路由错误:Missing :controller key on routes definition。另外,感谢您发现报价问题!
    • 使用get 'update_players', to: 'games#update_players' as: 'update_players'修复Missing :controller key on routes definition
    • 这修复了Missing:controller key on routes def 并允许路由在表单提交后工作,但在第一次输入时不起作用,出现此错误:ActiveRecord::RecordNotFound (Couldn't find Game with 'id'=update_players): app/controllers/games_controller.rb:10:in show'... Strange; after rendering 'new' it attempts to process GamesController#show as JS`.. . 更新了上面的 games_controller.rb 以显示 show def。
    【解决方案2】:

    解决方案:

    我需要为 ajax url 使用绝对路径。因为我在我的 ajax url 中使用了相对路径 'update_players',所以 rails 将 games/ 添加到新操作而不是创建操作。路线保持不变。

    更新资产/javascripts/games.coffee:

    update_players = ->
      $.ajax '/games/update_players',
        type: 'GET'
        dataType: 'script'
        data: {
          group_id: $("#groups-select option:selected").val()
        }
        error: (jqXHR, textStatus, errorThrown) ->
          console.log("AJAX Error: #{textStatus}")
        success: (data, textStatus, jqXHR) ->
          console.log("Dynamic player select OK!")
    
    $(document).on 'ready page:load', update_players
    $(document).on 'change', '#groups-select', update_players
    

    感谢 Зелёный 让我走上正确的道路

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-11
      • 2018-03-04
      • 1970-01-01
      • 2014-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多