UsersController中的ActionController :: ParameterMissing #update

时间:2016-08-10 23:18:47

标签: ruby-on-rails ruby actioncontroller

我有一个小游戏,在游戏结束后,用户链接到一个显示所有用户的排行榜及其分数的视图。为此,我将链接视为更新操作,以便在游戏结束后可以更新用户分数,但是,在单击链接后,我收到错误消息“param is missing or value is empty:user”。我也想知道这是否是由于没有任何形式可以填充只是一个正在更新的变量。

控制器:

class UsersController < ApplicationController
def new
    @user = User.new
end

def create
    @user = User.new(user_params)
    if @user.save
        session[:user_id] = @user.id 
        redirect_to '/play'
    else
        render '/'
    end
end

def update
    @user = User.find(current_user)
    if @user.update(user_params)
        redirect_to '/leaderboard'
    else
        render '/play'
    end
end

private
def user_params
    params.require(:user).permit(:nick_name, :score)
end
end



class ScoresController < ApplicationController
before_action :require_user, only: [:index]

def index
    @user = User.find(current_user)     
    @score = @user.score
    @score = 0
end

def leaderboard
    @users = User.all
end
end

查看链接:

    <div class="game-over"><%= link_to 'Game Over', "/update", :style => 'text-decoration:none; color:white;' %></div>

路线:

Rails.application.routes.draw do
  root 'users#new', as: :users
  post '/' => 'users#create'

  get '/logout' => 'sessions#destroy'

  get '/play' => 'scores#index', as: :user 
  get '/update' => 'users#update'
  get '/leaderboard' => 'scores#leaderboard'

2 个答案:

答案 0 :(得分:0)

user必须出现在请求参数中,因为您需要在user_params中使用它。您可以更改link_to以使用查询参数,如下所示:

link_to "Refresh", {controller: 'users', action: 'update', nick_name: "#{user.nick_name}", score: "#{get_score}"}, style: '...'

或更改更新路由以在网址中包含这些参数。

# routes.rb
get '/update/:nick_name/:score' => 'users#update'

提示:您可能应该将其更改为PUT并改为使用表单,因为更新操作会改变服务器中的状态。

答案 1 :(得分:0)

看起来您使用的任何内容都要通过您的参数来使请求未正确嵌套在用户密钥下。