【问题标题】:NoMethodError: undefined method `[]' in rails 3NoMethodError:Rails 3 中未定义的方法“[]”
【发布时间】:2013-05-01 05:58:20
【问题描述】:

这是我的 SessionsController

class SessionsController < ApplicationController

def new
end

def create
    user = User.find_by_email(params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
        # Sign the user in and redirect to the user's show page.
        sign_in user
        redirect_to user
    else
        flash.now[:error] = 'Invalid email/password combination' # Not quite right!
        render 'new'
    end
end


def destroy
end

结束

这里是 routes.rb

resources :sessions, only: [:new,:create,:destroy]

还有新视图和销毁视图的相应路由。

这是新的.html.erb

<% provide(:title , "Sign in")%>
<div id="signin_page" class="hero-unit container-fluid">
<h1>Sign In</h1>
<div class="row span6">
<%= simple_form_for :sessions, url: '/sessions', html: {:class=> 'form-horizontal'} do |f| %>
<%= f.input :email, label: "Email", placeholder: "Enter email",required: true%>
<%= f.input :password, label: "Password", placeholder: "Enter Password", required: true%>
<p id="signin_button"><%= f.button :submit, "Sign in", class: "btn btn-large btn-primary span2" %> 
    New user? <%=link_to "Sign up now!", '/signup'%></p>

<% end %>
</div>

错误是这样的。

我想要实现的是,成功/失败的标志应该使用 Flash 消息呈现各自的视图。 我哪里错了。 我是 ROR 的新手

【问题讨论】:

    标签: ruby-on-rails nomethoderror rails-flash


    【解决方案1】:

    您必须使用sessions 而不是session,即使用

    params[:sessions][:email]
    

    而不是

    params[:session][:email]
    

    正如您的表单所说的sessions,即simple_form_for :sessions。

    但在控制器中,您正在访问params[:sessions],即nil,然后在其上调用[:email],因此出现错误

    undefined method '[]' for nil:NilClass
    

    因此改变

    user = User.find_by_email(params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
    

    到

    user = User.find_by_email(params[:sessions][:email].downcase)
    if user && user.authenticate(params[:sessions][:password])
    

    然后它应该可以工作

    【讨论】:

    • 这对我来说是一个愚蠢的错误。感谢您的快速回复。 :)
    【解决方案2】:

    这是因为params[:session][:email] 的值为零。

    根据您的打印屏幕,它应该是params[:sessions][:email]

    【讨论】:

      【解决方案3】:

      我认为是一个更好的选择

      user = User.find_by(email: params[:sessions][:email].downcase)
      

      可能是:

      user = User.find_by(email: params[:sessions][:email].downcase) if params[:sessions].try(:[],:email)
      

      这意味着如果 params[:sessions] 或 params[:sessions][:email] 为 nil,则 user 将为 nil。 IE。即使 params 为空,也不会引发 NoMethodError。

      【讨论】:

        猜你喜欢
        • 2014-03-07
        • 1970-01-01
        • 1970-01-01
        • 2012-02-26
        • 1970-01-01
        • 2011-04-22
        • 1970-01-01
        • 2016-06-17
        • 2015-07-13
        相关资源
        最近更新 更多