我试图对您正在寻找的内容进行完整的演示。让我知道它是否适合你。
#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
更新:根据您的评论
问:我是创建一个新用户的资源并嵌套它还是嵌套已经建立的用户资源?
答:根据您的要求,任何资源都可以独立或嵌套定义。但是是的,您可以控制哪种方法可用哪种方式。就像您的情况一样,您只能在嵌套在资源下join
时允许方法。user
team
resources :users, :only=>:join do
member do
put :join
end
end
resource :users
在rake routes
有和没有:only=>:join
选项的情况下运行,并查看可用路线的差异。
问:会不会影响其他的事情?
Ans:如果你按照上面的例子严格定义你的路线,它应该不会影响其他事情。您应该通过 确认到您的应用程序的所有可用路由rake routes
。
问:我应该把我当前的routes.rb
文件放在那里吗?
Ans:假设您的当前routes.rb
将按上述方式进行修改。我可以回答这个问题吗?
问:对评论控制器感到困惑?
答:非常抱歉。是的,它必须users_controller.rb
像rake routes
命令显示的那样。从我自己的示例代码中复制和粘贴的结果:P
问:我应该放什么?构建方法
回答:在您的情况下,您的数据库中已经存在user
和。team
您需要做的只是建立关系。所以你可以只使用update_attribute
选项。我改变了加入方法。请检查。但是是的,如果要创建新条目,您可能需要构建方法。
这么晚才回复很抱歉 :)