Rails App在控制台与服务器中的行为不同

时间:2014-09-14 13:20:20

标签: ruby-on-rails ruby

给出以下类:

class DB
  cattr_accessor :get

  def self.connect(params)
    unless (params.has_key?(:user) && params.has_key?(:password))
      raise ArgumentError.new("Benutzername oder Passwort fehlen!")
    end
    self.get = Swift::DB::Mysql.new $dbconfig.merge(params)
    puts "Connection Successful from DB.connect"
  rescue Swift::ConnectionError
    puts "rescue Swift::ConnectionError in DB.connect"
    raise
  end

  # ...

end

以及以下控制器:

class SessionsController < ApplicationController
  def create
    DB.connect connection_params
    puts "connect: success!"
    # ...
    redirect_to root_url, info: "Hallo, #{session[:user]}!"
  rescue Swift::ConnectionError
    puts "rescue Swift::ConnectionError in SessionsController#create"
    flash.now[:danger] = "Benutzername oder Passwort falsch."
    render "new"
  end

  # ...

  private
  def connection_params
    params.permit(:user, :password)
  end
end

好的,现在我测试./bin/rails console中的所有内容:

Loading development environment (Rails 4.1.5)
2.1.2 (main):0> params = {user: "foo", password: "bar"}
=> {:user=>"foo", :password=>"bar"}
2.1.2 (main):0> DB.connect(params)
rescue Swift::ConnectionError in DB.connect
Swift::ConnectionError: Access denied for user 'foo'@'localhost' (using password: YES)
from /path/to/app/models/concerns/db.rb:8:in `initialize'

很好,很有效!让我们开始./bin/rails server并调用我们的Session控制器! 但是......没有运气:(服务器日志:

Started POST "/login" for 127.0.0.1 at 2014-09-14 15:14:57 +0200
Processing by SessionsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"...=", "user"=>"foo", "password"=>"[FILTERED]", "commit"=>"Login"}
Unpermitted parameters: utf8, authenticity_token, commit
Connection Successful from DB.connect
connect: success!
...
Redirected to http://localhost:3000/
Completed 302 Found in 2ms

注意Connection Successful from DB.connect输出。

我错过了什么?我一次又一次疯狂地测试它,重写所有内容......为什么在控制台中这种行为与在服务器上的行为不同?

2 个答案:

答案 0 :(得分:0)

对于所有非GET请求,Rails需要一个真实性令牌。当您从控制台尝试时,它实际上不是Web请求。您正在使用正确的真实性令牌发出POST请求,因此它可以在Web请求中使用。

答案 1 :(得分:0)

感谢@emaillenin的评论实际上找到了问题:

使用Rails&#39;集成params.permit(...),所有键都是String类型。

所以在控制台上我正在做

Swift::DB::Mysql.new {:host=>"127.0.0.1", :port=>3306, :db=>"erp", :user=>"foo", :password=>"bar"}

在我正在调用的服务器上

Swift::DB::Mysql.new {:host=>"127.0.0.1", :port=>3306, :db=>"erp", "user"=>"foo", "password"=>"bar"}

完全搞砸了斯威夫特。 (请注意userpassword

的不同键
相关问题