【问题标题】:SyntaxError in UsersController#create -- @user.save Ruby on RailsUsersController#create 中的语法错误 -- @user.save Ruby on Rails
【发布时间】:2014-01-13 23:44:36
【问题描述】:

我是 RoR 的新手,在完成了僵尸轨道课程后,我正在尝试自己制作一个正在运行的版本。我目前正在按照本教程 (http://railscasts.com/episodes/250-authentication-from-scratch) 尝试从头开始制作身份验证系统。我知道它是在 Rails 3 中完成的,所以我在将一些东西更改为对 Rails 4 友好时获得了一些乐趣。

但是,在尝试创建用户时,我收到错误“SyntaxError in UsersController#create”指向我的 UsersController 的第 8 行(如果 @user.save)

** 编辑 ** /usr/local/rvm/gems/ruby-2.0.0-p353@global/gems/activesupport-4.0.2/lib/active_support/callbacks.rb:377:语法错误,意外' =',期待')'

错误是说期待一个 ')' 但我有一个 '=' 符号

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

  def create
    @user = User.new(user_params)
    if @user.save
      redirect_to root_url, :notice => "Signed up!"
    else 
      render "new"
    end 
  end   

  private

  def user_params
    params.require(:user).permit(:username, :email, :password, :salt, :encrypted_password)
  end    
end


class User < ActiveRecord::Base

  attr_accessor :password
  validates_presence_of :password, :on =>create # needed to move line up from below to. Cannot encrypt password without validating password
  before_save :encrypt_password

  validates_confirmation_of :password
  validates_presence_of :email
  validates_uniqueness_of :email

  def encrypt_password
      if password.present?
          self.password_salt = BCrypt::Engine.generate_salt
          self.password_hash = BCrypt::Engine.hash_secret(password, password_salt)
      end
  end   
end

【问题讨论】:

  • 您的模型中的:on =&gt;create 只是复制粘贴错误还是真的是这样?
  • :on =>create 是模型。需要将其移至 :encrypt_password 方法之前,因为我遇到了错误。
  • 尝试从 User 类中删除 attr_accessor :password...

标签: ruby-on-rails ruby ruby-on-rails-4 rails-activerecord


【解决方案1】:

您确定问题不在于您的User 模型吗?这个:

validates_presence_of :password, :on =>create

在语法上是有效的,但它没有任何意义。你确实有一个create 类方法,所以

:on => create

就 Ruby 而言没问题,但我怀疑 validates_presence_of:on 选项知道如何处理 User.create 将返回的内容。 validates_presence_of 内部可能发生了一些事情,试图将:on 值视为方法名称或类似名称,这种事情很容易从active_support/callbacks.rb 内部触发您令人困惑和奇怪的错误。一旦你开始使用instance_evalmodule_eval 和朋友,你的错误信息就会突然失去意义,Rails 会大量使用这些东西。

您的验证应如下所示:

:on => :create
# or
on: :create

所以先解决这个问题,看看会发生什么。

【讨论】:

  • 当我进行更改时,当我点击我的注册页面时,我现在收到错误消息。如果有帮助,这里是我的 git 仓库的链接:github.com/BrianLobdell/zombietwitter
  • 带有此更正的错误消息的副本:/Users/brianlobdell/Desktop/zombietwitter/app/models/user.rb:5:语法错误,意外':',期望keyword_end on:: create # 需要移动 lin... ^ user.save 列在“扩展源”下
  • 我正在使用 ruby​​ 2.0.0p353(2013-11-22 修订版 43784)[x86_64-darwin10.8.0]
  • 你应该使用validates_presence_of :password, :on =&gt; :create。我认为上下文很清楚。
  • 啊我的错。这解决了该错误消息,但现在我收到了关于 UserController#create uninitialized constant User::BCrypt 中的 NameError 的错误消息 到目前为止,真的很感谢您的帮助,伙计
猜你喜欢
  • 2015-07-20
  • 2017-03-14
  • 1970-01-01
  • 1970-01-01
  • 2015-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多