概念的に単純に見えることをしようとしていますが、うまくいきません。これが私がやろうとしていることです:
/users/index ページに単純な「検索」フォームがあります。現在のユーザーが検索フィールドに入力すると、jQuery Tokeninput を利用してユーザー (名前/ユーザー名) をオートコンプリートします。私がしたいのは、ユーザーに名前を入力させ、リストからユーザーを選択してから、「送信」をクリックして、選択したユーザーのプロファイル (/users/:id/ - Users#show) に移動させることです。user_id を :user_token として送信するように jQuery Tokeinput を構成しました。
私はこれを機能させることができないようです。オートコンプリート部分は正しく機能しますが、入力したユーザーのプロフィールが表示されるように「送信」する方法がわかりません。
フォームの「送信」ボタンを押すと、次のようになります (ターミナルの開発ログから取得)。
Started PUT "/users/2" for 127.0.0.1 at 2012-05-08 11:19:56 -0400
Processing by UsersController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"blah blah=", "user"=>{"user_token"=>"41"}, "commit"=>"Go to profile", "id"=>"2"}
User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = 2 LIMIT 1
User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", "2"]]
CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1
Completed 500 Internal Server Error in 83ms
NoMethodError (undefined method `downcase!' for nil:NilClass):
app/controllers/users_controller.rb:119:in `update'
したがって、ユーザーコントローラーで更新アクションを呼び出しています。「@user」が既に存在しているためだと思います(具体的には、送信ボタンをクリックするのは current_user です)。
画面に次のように表示されます。
一番上に表示されるパスは .../users/2 (現在のユーザーの ID) で、ブラウザには次のように表示されます。
UsersController#update の NoMethodError
未定義のメソッド `downcase!' nil:NilClass の場合
ユーザーコントローラーで「更新」アクションを実行しようとしていて、「ダウンケース!」があるため、それを取得しています。更新アクションの開始時にパラメーターの 1 つを呼び出します。そのパラメーター ([:user][:email]) は、私が送信しているフォームにないため、明らかに存在しません。
私が実際にやりたいことは、「/users/41」(params[:user][:user_token] として渡された ID を持つユーザーの表示ページ) に移動することです。どうすればいいですか?
関連するすべてのコードは次のとおりです。
#users_controller.rb#Index
def index
@title = "All users"
@label = "All users"
@list_users = User.order(:name).page(params[:page]) #generates users shown on index page
@user = current_user
# This is used to populate the autocomplete field in the little search form
@users = User.where("LOWER(name) like ? OR LOWER(username) like ?", "%#{params[:q].downcase}%", "%#{params[:q].downcase}%").order('name ASC').limit(10) if params[:q]
respond_to do |format|
format.html # index.html.erb
format.json { render json: @users, :only => [:id, :name, :username] }
end
end
私のルート...
#routes.rb
resources :comments
resources :invitations
resources :sessions, :only => [:new, :create, :destroy]
resources :shares, :controller => "item_shares", :as => "item_shares" do
resources :comments
end
resources :posts, :controller => "item_posts", :as => "item_posts" do
resources :comments
end
resources :items
resources :relationships, only: [:create, :destroy]
resources :users do
member do
get :following, :followers
end
end
resources :password_resets
match '/signup', :to => 'users#new'
match '/signup/:invitation_token' => 'users#new', :as => :signup_with_invitation
match '/signin', :to => 'sessions#new'
match '/signout', :to => 'sessions#destroy'
match '/invite', :to => 'invitations#new'
match '/users/:id/shared', :to => 'users#shared'
match '/users/:id/received', :to => 'users#received'
match '/users/:id/saved', :to => 'users#saved'
match '/users/:id/posts', :to => 'users#posts'
match '/reciprocal_followers', :to => 'users#reciprocal_followers'
root :to => 'pages#home'
これが私のフォームです(jQuery Tokeninputは機能しますが、これは間違いなく機能しません):
#_user_search_form.html.erb
<div class="form">
<span class="form-label-right round-bottom-left-5 round-top-right-5 gray-gradient">Find someone</span>
<%= form_for @user, :action => "show" do |f| %>
<div class="field">
<%= f.label :user_token, "Name or Username" %></br>
<%= f.text_field :user_token, :placeholder => 'John Doe or JohnDoe123', "data-pre" => (@pre_populate_data.to_json(:only => [:id, :name, :username]) unless @pre_populate_data.nil?) %>
</div>
<div class="actions">
<%= f.submit "Go to profile" %>
</div>
<% end %>
</div>
私のユーザーモデルの関連部分は次のとおりです。
#user.rb
attr_accessible :user_token
attr_reader :user_token