Ruby on Rails教程第9章

时间:2012-08-01 18:24:10

标签: ruby-on-rails-3

我对params的[:session]的加入感到困惑。它似乎也打破了我的网站。有人可以解释一下这对我有什么影响吗?

class SessionsController < ApplicationController
  .
  .
  .
  def create
    user = User.find_by_email(params[:session][:email])
    if user && user.authenticate(params[:session][:password])
      sign_in user
      redirect_back_or user
    else
      flash.now[:error] = 'Invalid email/password combination'
      render 'new'
    end
  end
  .
  .
  .
end

错误讯息:

1)身份验证登录信息无效      失败/错误:{click_button“登录前}}      NoMethodError:        未定义的方法[]' for nil:NilClass # ./app/controllers/sessions_controller.rb:7:in创建'      #(eval):2:在'{/ p>中的click_button' # ./spec/requests/authentication_pages_spec.rb:18:in块(4级)中

编辑8/2

我认为问题与从form_for切换到form_tag有关。我在交换机中丢失了对会话的引用,因为我无法弄清楚如何正确地包含它。如果有人对此问题有任何建议,将非常感谢。我想知道是否有一个实际的理由想让它成为params [:session] [:email]而不是仅仅是为了组织?

new.html.erb

<% provide(:title, "Sign in") %>
<h1>Sign in</h1>

<div class="row">
  <div class="span6 offset3">
    <%= form_tag sessions_path do %>

      <%= label_tag :email %>
      <%= text_field_tag :email %>

      <%= label_tag :password %>
      <%= password_field_tag :password %>

      <%= submit_tag "Sign in", class: "btn btn-large btn-primary" %>
    <% end %>

    <p>New user? <%= link_to "Sign up now!", signup_path %></p>
  </div>
</div>

3 个答案:

答案 0 :(得分:1)

尝试删除适用于我的[:session]括号

答案 1 :(得分:0)

它制动你的代码'因为params [:session]是nil我认为你想从nil得到[:email],那么应该导致异常。教程中应该有一些代码定义了params [:session] hash。试着看起来更好。 为了使您的代码稳定,您必须确保始终定义params [:session]或尝试使用ternar function params [:session]? params [:session] [:email]:''

答案 2 :(得分:0)

您可以在视图中替换它:

<%= form_for :session, :url => sessions_path do %>

  <%= label_tag :email %>
  <%= text_field_tag :email %>

  <%= label_tag :password %>
  <%= password_field_tag :password %>

  <%= submit_tag "Sign in", class: "btn btn-large btn-primary" %>
<% end %>

form_tag只生成一个HTML表单标签,form_for用于描述某些内容。使用form_for创建的表单字段的所有输入都将具有如下名称:user_session[email]。因此,当您提交表单时,在控制器中,您将拥有:params[:user_session][:email]