1

我试图让这个工作,查看多个教程,这里的问题尝试了大约一周的不同事情,但我无法让视图正常工作。

我有用户团队。一个团队has_many用户和一个用户belongs_to一个团队(一次一个团队)。我知道该关联有效,因为我使用控制台使其正常工作(那里有一些帮助)。我不确定如何让它在视图中工作。以下是代码,如果需要更多,请告诉我。

我错过了什么?

_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

更新:根据您的评论

问:我是创建一个新用户的资源并嵌套它还是嵌套已经建立的用户资源?

答:根据您的要求,任何资源都可以独立或嵌套定义。但是是的,您可以控制哪种方法可用哪种方式。就像您的情况一样,您只能在嵌套在资源下join时允许方法。userteam

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.rbrake routes命令显示的那样。从我自己的示例代码中复制和粘贴的结果:P

问:我应该放什么?构建方法

回答:在您的情况下,您的数据库中已经存在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 回答