编辑配置文件表单的未定义方法错误? (Ruby on Rails)

时间:2015-06-07 15:49:40

标签: ruby-on-rails ruby forms models

我正在尝试为我的用户创建编辑个人资料选项。我将其中一个参数传递给表格":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并且它不起作用。正如您所看到的,我对此感到陌生,我们将非常感谢您的帮助! 谢谢!

2 个答案:

答案 0 :(得分:2)

  

我尝试在模式中添加:name,但它没有用。

只是为了说清楚:你应该从不手动更改schema.rb文件,因为它只包含底层数据库结构的概述,但对它没有影响。如果您想要更改数据库结构,则应使用迁移(仔细阅读this)。

正如您已经提到的那样,您使用了Sorcery gem,所以问题现在显而易见了:它的生成器只定义emailpasswordsalt属性(正如我从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作为允许的参数之一