form_for - 未定义的方法

Posted

技术标签:

【中文标题】form_for - 未定义的方法【英文标题】:form_for - undefined method 【发布时间】:2014-04-07 16:01:06 【问题描述】:

我尝试创建一个 Sign_in-formular (link to tutorial),但收到以下错误代码:

在 2014-04-07 17:50:54 +0200 开始为 127.0.0.1 获取“/user/sign_in” ActiveRecord::SchemaMigration 负载 (1.0ms) SELECT "schema_migrations".* FROM "schema_migrations" 由 UserController#sign_in 处理为 html 在布局/应用程序中渲染用户/sign_in.html.erb (19.0ms) 在 92 毫秒内完成了 500 个内部服务器错误

ActionView::Template::Error(表单中的第一个参数不能包含 nil 或为空): 1:登录 2: :user, :url => sign_in_path(@user) 做 |f| %> 3: 4: app/views/user/sign_in.html.erb:2:in `_app_views_user_sign_in_html_erb___114454536_30263052'

此外,我添加了所有内容(我认为这就是您需要了解的全部内容),这取决于错误代码。 如果您需要更多信息,请告诉我。 如果我添加的信息过多,请告诉我。 我会在之后编辑帖子。

型号:(user.rb)

class User < ActiveRecord::Base
  attr_accessible :email, :username, :password, :password_confirmation
  attr_accessor :password
  before_save :encrypt_password

  validates_confirmation_of :password
  validates_presence_of :password, :on => :create
  validates_presence_of :email, :on => :create
  validates_presence_of :username, :on => :create
  validates_uniqueness_of :email
  validates_uniqueness_of :username

  def self.authenticate_by_email(email, password)
    user = find_by_email(email)
    if user && user.password_hash == BCrypt::Engine.hash_secret(password, user.password_salt)
      user
    else
      nil
    end
  end

  def self.authenticate_by_username(username, password)
    user = find_by_username(username)
    if user && user.password_hash == BCrypt::Engine.hash_secret(password, user.password_salt)
      user
    else
      nil
    end
  end

  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

控制器:(user_controller.rb)

class UserController < ApplicationController
  def sign_in
    @user = User.new
  end

  def login
    username_or_email = params[:user][:username]
    password = params[:user][:password]

    if username_or_email.rindex('@')
      email = username_or_email
      user = User.authenticate_by_email(email, password)
    else
      username = username_or_email
      user = User.authenticate_by_username(username, password)
    end

    if user
      flash[:notice] = 'Welcome'
      redirect_to :root
    else
      flash[:error] = 'Unknown user. Please check your username and password.'
      render :action => "sign_in"
    end
  end

  def change_pw
  end

  def forgot_pw
  end

  def new
  end

  def sent_pw
  end

  def sign_in
  end

  def signed_out
  end
end

查看:(sign_in.html.erb)

<p>Sign In</p>
<%= form_for @user, :as => :user, :url => sign_in_path(@user) do |f| %>
    <p>
      <%= f.label 'username or email:' %><br />
      <%= f.text_field :username %>
    </p>
    <p>
      <%= f.label 'password:' %><br />
      <%= f.password_field :password %>
    </p>
    <p>
      <%= f.submit 'Sign In' %>&nbsp;&nbsp;&nbsp;
      <%= f.submit 'Clear Form', :type => 'reset' %>
    </p>
<% end %>

路线 (routes.rb)

Calendar::Application.routes.draw do
  root "welcome#index"

  get "user/change_pw"
  get "user/forgot_pw"
  get "user/new"
  get "user/sent_pw"
  get "user/sign_in"
  get "user/signed_out"
  get "welcome/index"

  post "sign_in" => "user#login" #ein HTTP post auf der Seite sign_in führt die Methode login im user controller aus
end

【问题讨论】:

【参考方案1】:

您在UserController 中定义了两次sign_in 方法。从UserController 的底部删除sign_in 的第二个定义(空方法)。

如您所见,您已经重新定义了方法sign_in,因此Ruby 会选择最新的方法定义进行评估,其中您没有设置@user。因此,错误。

【讨论】:

我一定是在开玩笑!我对此感到很糟糕......但感谢您的帮助。我应该休息一下。 没问题。它发生了 :) 请在超时结束时接受答案。 @KirtiThorat & Ismoh Ruby 解释在这里得到了最好的解释。 @KirtiThroat:完成:] |你是什​​么意思,阿洛克阿南德? @KirtiThorat:我将视图代码放在不同的视图中(application.html.erb)。现在我得到了和以前一样的错误,因为在 application_controller.rb 中没有定义方法。如何从 user_controller 访问该方法? - 问题是我将登录表单放在应用程序布局中,因为它在导航栏标题中。

以上是关于form_for - 未定义的方法的主要内容,如果未能解决你的问题,请参考以下文章

Rails隐藏字段未定义方法“合并”错误

未定义的方法`client_path'

Rails 文件上传错误“nil:NilClass 的未定义方法‘original_filename’”

表单中f.select上的“未定义”占位符

有没有办法自定义 form_for 按钮?

goland出现未定义Gotoot解决方法