2012-09-27 69 views
0

我試圖讓這個工作,看着多個教程,這裏的問題現在嘗試不同的事情大約一個星期了,我無法讓視圖正常工作。我有用戶組。 A團隊has_many用戶用戶belongs_to a團隊(一次一個團隊)。我知道該協會的工作原理,因爲我使用控制檯工作(有一些幫助)。我不知道如何讓它在視圖中工作。下面是代碼,請讓我知道是否需要更多。Rails 3.2一對多視圖

我錯過了什麼?

_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 
+0

有什麼方法在'user_controller',需要一個TEAM_ID並加入用戶那支球隊?如果在這裏添加該功能。運行'rake:routes'來查看'form_for'實際上會指向那個方法。另外你的'form_for'應該有'team_id',否則用戶將會加入哪個團隊? – Samiron

+0

「join_button」將出現在團隊的展示頁面上。我認爲構建方法應該在協會的「has_many」部分。這就是爲什麼我有「@user = current_user.users.build如果signed_in?」在Teams_controller中。 我基於邁克爾哈特爾的教程microposts關係。用戶has_many微博和microposts belongs_to一個用戶,在我的users_controller它說:「@micropost = current_user.microposts.build ...」 沿着這些路線,我認爲「ID」自動拾取。我沒有在micropost表單上定義user.id? –

+0

你好,史蒂夫,沒有聽到你的任何更新......最新狀態? – Samiron

回答

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 
+0

您需要使用'hidden_​​field'來設置'team' id。你的網址應該說。仔細按照我的例子。另一個建議是使用'link_to'而不是'form_for'。我也在視圖代碼中添加了這一點。 – Samiron

3

我試圖完整展示您在尋找什麼。讓我知道它是否適合你。

#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 

更新:基於您的評論

問:難道我創建一個新的用戶資源和窩那還是我窩在已經建立用戶的資源?

Ans:根據您的要求,任何資源可以單獨定義或嵌套定義。但是,您可以控制哪種方法可以以哪種方式提供。就像你的情況一樣,當你的user嵌套在team資源下時,你只能允許使用join方法。

resources :users, :only=>:join do 
    member do 
     put :join 
    end 
end 
resource :users 

運行rake routes與不:only=>:join選項,並查看可用的路線不同。

問:會影響其他事情嗎?

答案:如果你嚴格按照上面的例子定義你的路由,它不應該影響其他的東西。您應該通過rake routes確認您的應用程序的所有可用路線。

問:我應該把目前的routes.rb文件放在那裏嗎?

回答:假設您目前的routes.rb將以上述方式修改。我能回答這個問題嗎?

問:困惑的評論控制器?

Ans: Im extreamely對不起。是的,當rake routes命令顯示時它必須是users_controller.rb。從我自己的示例代碼複製和粘貼的結果:P

問:我應該在那裏放什麼?構建方法

答:在你的情況這兩個userteam已經存在於數據庫中。你所需要做的只是建立一種關係。所以你可以使用update_attribute選項。我改變了連接方法。請檢查。但是,如果想要創建新條目,您可能需要構建方法。

很抱歉這麼晚纔回復:)

+0

@ samiron-paul感謝您的回答。在接受之前我只有幾個問題。這對我來說很有意義,但我已經擁有了一個用戶資源,用戶可以選擇加入或不加入團隊(他們不需要) 我是否創建新的用戶資源並嵌套或嵌套?已經建立用戶資源?這會影響其他事情嗎? 我應該把我目前的routes.rb文件放在那裏嗎? 對評論控制器感到困惑嗎?這應該是團隊還是用戶的控制者,我應該放哪些東西?構建方法? –