なぜモデルです。見行動に配備された環境とは異なる開発環境にやさしいか?
-
19-09-2019 - |
質問
をRuby on Railsとカピストラーノ、gitっ走るというのは本当に面倒問題..
私は、コントローラを持つ"人々"のアクションするとどうなるのかわかりません
def index
@people = Person.find( :conditions => params[:search] )
end
あboolean"is_admin"の欄に人ます。この人の管理者とは、取得の呼び出 http://localhost:3000/people?search[is_admin]=true きの移植 @人 一部のユーザー...およびこれは私の地元のpcかのアプリ 開発 モードの..
がっかり。私が展開する私のサーバーアカウント(railsplayground)呼び出すと、 http://mydomain.com/people?search[is_admin]=true 失敗したいずれかを見つけマッチング。ただし、変更したい ...?検索[is_admin]=true へ ...?検索[is_admin]=1 の応答を返します、管理者のユーザーとして期待---
アルバイトのローカルpcの利用は"1"の代わりに"true"に失敗します。
下線は
Person.find( :all, :conditions => { :is_admin => 'true' } )
作品は私の開発環境
Person.find( :all, :conditions => { :is_admin => 1 } )
作品は私の展開環境です。
これはなぜであろうか。どうしたらいいですか?
理想的にはいい場所のようなリンク:
link_to( "Administrators", {
:controller => '/people',
:action => :index,
:search => { :is_admin => true }
})
を得のリスト管理者:).
れにふさわしい注自開発のデータベースは、sqlite3のファイル生産は、mysqlデータベース...
編集:私の理解に異議を唱えユーザー入力、ここでは例外的な場合でも非常に軽微な脅威であった。また、現在のコードのコンビニエンスストアでは自分のpcは、生産の口座ませんのでご注意ください。最も簡単なsollutionのように働きかけることによって保存-sqlite3interperets boolean型の値は、変更に私からの質問"を変えたいの方sqlite保存すboolean型の値の"...場合はsqliteうに模倣したmysqlの動作が完全に、自開発のニーズをカップルにオススメです。
解決
問題はすぐにboolean値を文字列として最終的な行動により活性データベースです。こちらの詳細な説明をします。
きを読む params[:search]
変数の内容が文字列があるわけではないタイプです。これは、クエリー文字列なのかを理解すること
params[:search][:is_admin] = "true"
実際に手段
params[:search][:is_admin] = "true"
params[:search][:is_admin] = true
同様に、き1また
params[:search][:is_admin] = "1"
るとは異なる
params[:search][:is_admin] = 1
行き値のクエリで使わせるのではなくboolean型の値ではない翻訳のデータベースアダプター。最終クエリの結果のようなもの
SELECT * FROM `persons` WHERE `persons.is_admin` = 'true'
SQLite3店舗のbooleanとしてt/fの文字列です。 true
として保存された 't'
や false
として保存された 'f'
.うことなんでしょうけれども理解true/falseの場合、自動的に変換すご返します。に対して、MySQLを理解しみ0/1、true/falseの場合で失敗します。
切り替える場合の挙動、 1
の代わりに true
, だがSQLiteができな翻訳の文字列 "1"
へ 't'
.に対して、MySQLができます。
両方の場合、確認することができます間違っています。なんかパス文字列がboolean値です。また、アナフィラキシー様の信頼ユーザの入力します。
私の提案は正常に params[:search]
前給 Person.find
.
他のヒント
と思うの違いをmysqlの原因となのですか?
を中心に活動記録完備する直接渡からクエリ文字列のと思われるのは悪いことをしてくださいが残すことができるアプリの開sqlインジェクション攻撃であった。
@シモーネ答えが説明できな行動です。に正しい結果をもsqlite3、mysqlした場合:
Person.find( :all, :conditions => { :is_admin => true } )
場合のみとなっていレベルのパラメータで params[:search][:something]
もより深い)を作成でき正しいハッシュとのこのような状態:
my_conditions = Hash.new
params[:search].each do |item, value|
my_conditions[item.to_sym] = value == 'true' ? true : value == 'false' ? false : value
end
まに対して繰り返し処理を実行すべての検索paramsと変化して 'true'
へ true
や 'false'
へ false
.場合がありますのでお任せします。もちろんこの他論理をしています。ればなりますので以上に複雑できる書き換えで if
または switch
.
また、運営をサポートす:
Person.all(:conditions => my_conditions)