给出以下类:
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
输出。
我错过了什么?我一次又一次疯狂地测试它,重写所有内容......为什么在控制台中这种行为与在服务器上的行为不同?
答案 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"}
完全搞砸了斯威夫特。 (请注意user
和password
)