2009-09-30 102 views
0

下面的代码正在工作,但我想知道是否有更好的方法来完成此操作。这是正确的RESTful方式吗?任何的意见都将会有帮助。其基本要求是,我需要一种方法来创建和销毁从地方会员/ show.html.erblink_to创建并销毁来自其他资源的资源

class Place < ActiveRecord::Base 
    has_many :memberships 
    has_many :members, :through => :memberships, :source => :user 

    def membership_for_user(user) 
    self.memberships.select{|m| m.user_id == user.id} 
    end 
end 

class User < ActiveRecord::Base 
    has_many :memberships 
end 

class Membership < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :place 
end 

class MembershipsController < ApplicationController 
    def create 
    @membership = Membership.new({:user_id => current_user.id, :place_id => params[:place_id]}) 
    unless @membership.save 
     flash[:notice] = "Unable to become member." 
    end 
    redirect_to place_path(params[:place_id]) 
    end 

    def destroy 
    @membership = Membership.find(params[:id]) 
    place_id = @membership.place_id 
    @membership.destroy 
    redirect_to place_path(place_id) 
    end 
end 

地方/ show.html.erb

<%= link_to 'Join', memberships_path(:place_id => @place.id), :method => :post %> 
<%= link_to 'Cancel', @place.membership_for_user(current_user), :method => :delete %> 

回答

1

这看起来很奇怪 - 怎么能您是否在同一页面上创建和删除成员资格?

您是在选择link_to语句中的一个还是其他用户,或者用户是否有多个成员资格到同一个地方?

我会考虑:

  • 使用的form_for(@membership),而不是第一的link_to,与hidden_​​field:place_id
  • 加载控制器中的成员资格,这将简化第二的link_to。
0

@ klochner是对的;这是错误的。您需要事先创建成员资格,并在成员资格上拥有状态属性,如果您想这样做,您可以更新为“已接受”或仅删除成员资格。否则,您需要一个表单来首先创建成员资格。