1

私はこれを機能させようとしましたが、複数のチュートリアルを見て、ここでの質問は約 1 週間さまざまなことを試しましたが、ビューを正しく機能させることができません。

ユーザーのチームがあります。チームhas_manyユーザーユーザーbelongs_toチーム(一度に 1 つのチーム)。コンソールを使用して機能させたので、関連付けが機能することを知っています(そこにいくつかの助けがありました)。ビューで動作させる方法がわかりません。以下はコードです。さらに必要な場合はお知らせください。

私は何が欠けていますか?

_join_team_button

<%= form_for(@user) do |f| %>
  <%= f.submit "Join Team", class: "btn btn-large btn-primary" %>
<% end %>

チームショーページ

<%= render 'shared/join_team_button %>

チームコントローラー

def show
  @team =  Team.find(params[:id])
  @team_members = @team.users
  @user = current_user.users.build if signed_in?
end

ユーザーコントローラー

def show
  @user = User.find(params[:id])
  @teams = @user.team
end
4

2 に答える 2

4

私はあなたが探しているものの完全なデモンストレーションを入れようとしました。それがあなたに合うかどうか私に知らせてください。

#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メソッドを許可することができます。userteam

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オプションを使用できます。結合方法を変更しました。チェックしてください。ただし、新しいエントリを作成する場合は、ビルドメソッドが必要になる場合があります。

返事が遅れて申し訳ありません :)

于 2012-09-28T03:58:24.400 に答える
0

私はそれを考え出した。まだ完全ではありませんが、関連付けが機能します。チームとユーザーは既に作成されており、関連付けを確立する必要があっただけなので、ビルド メソッドは機能しませんでした。ここに私が持っているものがあります:

意見:

<%= form_for(@user) do |f| %>
<%= f.hidden_field :team_id, :value => @team.id %>
  <%= f.submit "Join Team", class: "btn btn-large btn-primary" %>
<% end %>

チーム コントローラー:

def show
  @team =  Team.find(params[:id])
  @team_members = @team.users
  @user = User.find(params[:id]) if signed_in?
end
于 2012-09-29T14:58:29.053 に答える