2

数週間前に Rails でコーディングを開始しましたが、なぜこのエラーが発生するのかわかりません。ログインにはDevise、フォームにはFormtasticを使用しています。Acts_like_tags_on を追加してデータベースをリセットするまで、アプリは正しく動作していました。

エラー メッセージ: NoMethodError in UsersController#show

undefined method `username' for nil:NilClass

app/controllers/users_controller.rb:19:in `show'
Request

Parameters:
{"id"=>"sign_in"}

これは私がユーザーコントローラーに持っているものです:

def show
 @user = User.find_by_username(params[:id])
 @title = @user.username

 respond_to do |format|
   format.html # show.html.erb
   format.json { render json: @user }
 end
end

どんな入力でも役に立ちます。ありがとう!

@user = User.find_by_username(params[:id]) を次のように編集した後: @user = User.find_by_user(params[:id])

エラーは次のようになります: undefined method `find_by_user' for #

ユーザー名列は、ユーザー テーブルに存在します。

4

4 に答える 4

2
@user = User.find_by_username(params[:id])

上記の行は nil を返している可能性があります。User.find_by_username("Superman-is-awesome") を実行し、そのユーザー名がデータベースに存在しない場合、nil が返されます。

それからそれはやろうとしています:

@title = @user.username

これは本質的に次のとおりです。

@title = nil.username

もちろん、これは機能しません。そのため、渡すパラメーターに問題がある可能性があります。

また、User テーブルに「username」という列があることを確認してください。実行したことを確認してください:

rake db:migrate

同じように。

于 2011-06-21T02:31:56.463 に答える
1

ルートを正しく構成した場合は、次のように、ユーザー リソースの前にルートを作成する必要があります。

devise_for :users
resources :users, except: "create"
于 2012-04-03T16:32:59.507 に答える
0

user_id に「users」の値が指定されていることがわかりました。私のroutes.rbで次の行をコメントアウトした後、IDにその値が与えられなくなりました。

match '/:id' => 'users#show', :as => :user

また、ユーザー パスがユーザー名を使用するため、users_controllers #show に次の行を含める必要がありました。「_by_username」を削除すると、ユーザー名を要求するページでエラーが発生しました:

@user = User.find_by_username(params[:id])
于 2011-06-21T13:50:13.857 に答える
0

これは実際にはルーティングの問題です

問題は、devise が次のように曲がるルートがあることを期待していることです。

「/users/sign_in」をセッションに #new

しかし、ルートファイルにはそのルートがないため、ディスパッチャは次のものと照合しています:

次に進む「users/:id」ルート: users#show with :id => 'sign_in'

(したがって、「sign_in」のIDを持つユーザーを見つけようとするとエラーがスローされます)

devise の README ドキュメントを読む必要があります (ローカルに持っていない場合は google) - 特に、ルートの標準セットを config/routes.rb に追加する方法を説明する部分を読んでください。:)

その直後のはずです。

于 2011-06-21T14:27:59.207 に答える