【问题标题】:Undefined method error for Edit Profile form? (Ruby on Rails)编辑配置文件表单的未定义方法错误? (Ruby on Rails)
【发布时间】:2015-06-07 15:49:40
【问题描述】:

我正在尝试为我的用户创建一个编辑个人资料选项。我传递给表单 ":name" 的参数之一不起作用 - 我在哪里定义 :name 以便我的表单可以接受它并更新用户? “/users/3/edit 中的 NoMethodError #"的未定义方法“名称”

我的用户控制器:

    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 添加到架构中,但没有成功。如您所见,我对此很陌生,我们将不胜感激您的帮助! 谢谢!

【问题讨论】:

  • 您的users 数据库表中有name 字段吗?
  • 在架构中?是的,我输入了 t.string "name",但它仍然不起作用。我没有编辑/创建用户迁移,我使用了巫术。我应该将 :name 添加到魔法文件还是什么?

标签: ruby-on-rails ruby forms models


【解决方案1】:

我尝试将 :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)。

【讨论】:

    【解决方案2】:

    你的用户模式应该有一个名称属性,就像你的电子邮件、头像等一样。点击你的 Rails 控制台并运行 User.new 并验证 name 是属性之一。然后在您的用户控制器中添加名称作为允许的参数。

    def user_params
      params.require(:user).permit(:email, :password, :password_confirmation, :handle, :avatar, :name)
    end
    

    请注意,我将 :name 作为允许的参数之一包含在内

    【讨论】:

    • 您说得对,名称不存在 - 如何通过控制台手动添加名称? (对不起,我是个笨蛋)非常感谢!!!!!!!
    • 您无法从控制台向用户添加名称属性。如果 User 有一个 name 属性,您可以从控制台更改该属性的 VALUE。遵循两个否定建议在您的用户表中添加名称属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    相关资源
    最近更新 更多