私はあなたが探しているものの完全なデモンストレーションを入れようとしました。それがあなたに合うかどうか私に知らせてください。
#FILE: models/team.rb
class Team < AR::Base
has_many :users
end
#FILE: models/user.rb
class User < AR::Base
belongs_to :team
end
#FILE: config/routes.rb
#Here you are defining "users" as a nested resource of "teams"
resources :teams do
resources :users do
member do
put :join
end
end
end
#if you run "rake routes" it will show you the following line along with others
join_team_user PUT /teams/:team_id/users/:id/join(.:format) users#join
#FILE: controllers/team_controller.rb
def show
@team = Team.find(params[:id])
@team_members = @team.users
@user = current_user.users.build if signed_in?
end
#FILE: views/teams/show.html.erb
<% if(@user) %>
<%= form_for @user, :url => join_team_user_path(@team, @user) do |f| %>
<%= f.submit "Join Team", class: "btn btn-large btn-primary" %>
<% end %>
<% end %>
#You dont really need a form for this. You can simply use `link_to` like below
<%= link_to 'Join', join_team_user_path(@team, @user), method: :put %>
#FILE: controllers/users_controller.rb
def join
# params[:id] => is the user_id
@user = User.find(params[:id])
# params[:team_id] => is the team_id
@team = Team.find(params[:team_id])
# Now make the relationship between user and team here.
@user.update_attribute(:team, @team)
end
更新:あなたのコメントに基づく
Q:新しいユーザーのリソースを作成してネストしますか、それともすでに確立されているユーザーのリソースをネストしますか?
回答:要件に基づいて、任意のリソースを個別に定義することも、ネストして定義することもできます。しかし、はい、どのメソッドがどの方法で使用可能になるかを制御できます。あなたの場合のように、あなたはあなたがリソースの下にネストされているときにのみjoin
メソッドを許可することができます。user
team
resources :users, :only=>:join do
member do
put :join
end
end
resource :users
rake routes
オプションありとオプションなしで実行し:only=>:join
、利用可能なルートの違いを確認します。
Q:それは他のものに影響しますか?
回答:上記の例に従ってルートを厳密に定義する場合、他のものに影響を与えることはありません。アプリケーションへの利用可能なすべてのルートをで確認する必要がありますrake routes
。
Q:routes.rb
現在のファイルをそこに置く必要がありますか?
回答:routes.rb
現在が上記のように変更されると仮定します。質問に答えてもらえますか?
Q:コメントコントローラーについて混乱していますか?
回答:大変申し訳ありません。users_controller.rb
はい、rake routes
コマンドが表示しているとおりである必要があります。私自身のサンプルコードからのコピーアンドペーストの結果:P
Q:そこに何を置くべきですか?ビルド方法
回答:あなたの場合、user
との両方team
がデータベースにすでに存在しています。あなたがする必要があるのはただ関係を設定することです。したがって、update_attribute
オプションを使用できます。結合方法を変更しました。チェックしてください。ただし、新しいエントリを作成する場合は、ビルドメソッドが必要になる場合があります。
返事が遅れて申し訳ありません :)