我正在尝试为我的用户创建编辑个人资料选项。我将其中一个参数传递给表格":name"不会工作 - 我在哪里定义:名称所以我的表单可以接受并更新用户? " / users / 3 /编辑时的NoMethodError 未定义的方法`name'对于#"
我的用户控制器:
class UsersController < ApplicationController
skip_before_filter :require_login, only: [:new, :create]
def new
@user = User.new
end
def edit
@user = User.find(params[:id])
end
def create
@user = User.new(user_params)
if @user.save
redirect_to root_url, :notice => "Signed up!"
else
render :new
end
end
def show
@user = User.find(params[:id])
if current_user
@comment = @user.comments.build
end
end
private
def user_params
params.require(:user).permit(:email, :password, :password_confirmation, :handle, :avatar)
end
end
用户模型:
class User < ActiveRecord::Base
authenticates_with_sorcery!
validates :email, :handle, :name, uniqueness: true, presence: true
validates :password, confirmation: true
validates :password_confirmation, presence: true
has_many :game_players, foreign_key: :player_id
has_many :games, through: :game_players
has_many :comments
has_attached_file :avatar, :styles => { :medium => "300x300>", :thumb => "100x100#" }, :default_url => "/images/:style/missing.png"
validates_attachment_content_type :avatar, :content_type => /\Aimage\/.*\Z/
def total_wins
self.games.where.not(winner_id: nil).where(winner_id: self.id).count
end
def total_games
self.games.where.not(winner_id: nil).count
end
def total_losses
total_games - total_wins
end
def win_rate
total_games != 0 ? total_wins / total_games.to_f : 0
end
end
形式:
= form_for @user do |f|
.field
= f.label :name
= f.text_field :name
.field
= f.label :email
= f.text_field :email
.field
= f.label :gender
= f.password_field :gender
.field
= f.label :location
= f.password_field :location
.field
= f.label :bio
%br/
= f.password_field :bio
= f.file_field :avatar
%br/
= f.submit "Update"
请注意我没有单独的个人资料模型/控制器 - 我只是在用户模型下使用用户/编辑视图。
我尝试在模式中添加:name并且它不起作用。正如您所看到的,我对此感到陌生,我们将非常感谢您的帮助! 谢谢!
答案 0 :(得分:2)
我尝试在模式中添加:name,但它没有用。
只是为了说清楚:你应该从不手动更改schema.rb
文件,因为它只包含底层数据库结构的概述,但对它没有影响。如果您想要更改数据库结构,则应使用迁移(仔细阅读this)。
正如您已经提到的那样,您使用了Sorcery
gem,所以问题现在显而易见了:它的生成器只定义email
,password
和salt
属性(正如我从here看到的那样)。
您现在应该做的是生成rails迁移,以手动将所有其他必填字段添加到User
模型。幸运的是,Rails有内置的方法来做这种事情:
rails g migration AddNameToUser name:string
在shell中执行此操作会创建一个迁移文件。使用rake db:migrate
运行它会将name
字段添加到User
模型(并为您更新schema.rb
)。
答案 1 :(得分:0)
您的用户架构应具有名称属性,就像您对电子邮件,头像等一样。点击rails控制台并运行User.new
并验证该名称是否为其中一个属性。然后在您的用户控制器中添加名称作为允许的参数。
def user_params
params.require(:user).permit(:email, :password, :password_confirmation, :handle, :avatar, :name)
end
注意我包括:name作为允许的参数之一