我有一个小游戏,在游戏结束后,用户链接到一个显示所有用户的排行榜及其分数的视图。为此,我将链接视为更新操作,以便在游戏结束后可以更新用户分数,但是,在单击链接后,我收到错误消息“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'
答案 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)
看起来您使用的任何内容都要通过您的参数来使请求未正确嵌套在用户密钥下。