0

答えた。投稿の終わりを参照してください。

私は主にJava開発者であり、RubyonRailsはかなり初めてです。railstutorial.orgのチュートリアルを無事に完了しました。だから私はこれを一度動作させました。チュートリアルを2回実行し始めたときに問題が発生しましたが、今回は認証をSorcerygemに置き換えようとしています。そのための私の主な参照は、railscasts.orgのエピソード#283でした。一部は機能していましたが、サインインしようとすると、次のようなエラーが発生します。

SessionsController#createのActiveRecord :: PreparedStatementInvalid

[:email] =:loginの:emailの値がありません

これは非常に具体的ですが、多くの場所に現れる非常に一般的な単語であるため、検索するのは困難でした。元のチュートリアルを機能させたときと同じようにやっていると思います。以下は私のviews/sessions / new.html.erbで、元のチュートリアルとほぼ同じです。

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

<div class="row">
  <div class="span6 offset3">
    <%= form_for(:session, url: sessions_path) do |f| %>

      <%= f.label :email %>
      <%= f.text_field :email %>

      <%= f.label :password %>
      <%= f.password_field :password %>

      <%= f.check_box :remember_me %>
      <%= f.label :remember_me %>
  
      <%= f.submit "Sign in", class: "btn btn-large btn-primary" %>
    <% end %>

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

そして、これが私のsessions_controller.rbのcreateメソッドです。これは、魔術のためにチュートリアルとは少し異なりますが、params参照がチュートリアルと同じように機能しない理由はわかりません。

def create
  user = login(params[:session][:email], params[:session][:password])
  if user
    redirect_back_or_to root_url, :notice => "Logged in!"
  else
    flash.now[:error] = 'Invalid email/password combination' # Not quite right!
    render 'new'
  end
end

Railsキャストはparams[:email]を使用しますが、これは彼がform_forではなくform_tagを使用し、使用するparamを変更したためです。

私はここで本当に迷子になっています。チュートリアルと同じように機能しない理由がわかりません。どんな助けでも大歓迎です。追加情報を提供する必要があるかどうかをお知らせください。ありがとう。

編集:
上記の完全なエラーを追加しました。ソーサリーのログイン方法や私のデータベースに問題があるに違いありません。パラメータは正常に処理されています。これが完全なスタックトレースです(コードの私の部分に戻ります。それを超えると本当に長すぎます)。

スタックトレース:

activerecord(3.2.11)lib / active_record / sanitization.rb:141:in `block in replace_named_bind_variables '

activerecord(3.2.11)lib / active_record / sanitization.rb:135:in `gsub '

activerecord(3.2.11)lib / active_record / sanitization.rb:135:in `replace_named_bind_variables '

activerecord(3.2.11)lib / active_record / sanitization.rb:115:in `sanitize_sql_array '

activerecord(3.2.11)lib / active_record / sanitization.rb:28:in `sanitize_sql_for_conditions '

activerecord(3.2.11)lib / active_record / ratio / query_methods.rb:324:in `build_where '

activerecord(3.2.11)lib / active_record / ratio / query_methods.rb:136:in `where'

activerecord(3.2.11)lib / active_record / querying.rb:9:in `where'

ソーサリー(0.7.13)lib / sorcery / model / adapters / active_record.rb:32:in `find_by_credentials '

ソーサリー(0.7.13)lib / sorcery / model.rb:108:in `authenticate '

ソーサリー(0.7.13)lib / sorcery / controller.rb:33:in `login '

app / controllers / sessions_controller.rb:8:in `create '

私は自分の質問にすぐに答えるには新しすぎると思います。自分で修正しました:

sorcery.rbで、私は持っていました:

user.username_attribute_names ='[:email]'

どうやら、引用符はそこにあるべきではありません。ファイル内のコメントに戸惑いました。その変更を行った後、変更を有効にするためにサーバーを再起動する必要がありました。

4

2 に答える 2

1

自分で修正しました:

sorcery.rbで、私は持っていました:

user.username_attribute_names ='[:email]'

どうやら、引用符はそこにあるべきではありません。ファイル内のコメントに戸惑いました。その変更を行った後、変更を有効にするためにサーバーを再起動する必要がありました。

于 2013-01-22T17:25:58.103 に答える
0

魔術のソースコードが見えます。また、username_attribute_namesは配列である必要があります。

そしてこれはsorcery/spec / rails3 / spec /controller_spec.rbにあります:

sorcery_model_property_set(:username_attribute_names、[:username、:email])

呼び出されるのは:def find_by_credentials(credentials)sql = @ sorcery_config.username_attribute_names.map {| attribute | column_name(attribute)+ "=:login"} where(sql.join('OR')、:login =>credentials [0])。first end

だから、試してみてください

user.username_attribute_names = [:email]またはsorcery_model_property_set(:username_attribute_names、[:email])

于 2013-01-22T08:57:44.843 に答える