link_to从不同的资源创建和销毁资源

时间:2009-09-30 17:25:40

标签: ruby-on-rails rest

下面的代码正在运行,但我想知道是否有更好的方法。这是正确的RESTful方式吗?任何的意见都将会有帮助。基本要求是我需要一种方法来创建和销毁places / show.html.erb

中的成员资格
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 %>

2 个答案:

答案 0 :(得分:1)

这看起来很奇怪 - 您如何在同一页面上创建和删除成员资格?

您是选择了一个或另一个link_to语句,还是用户可以在同一个地方拥有多个成员资格?

我会考虑:

  • 使用form_for(@membership)代替第一个link_to,使用hidden_​​field:place_id
  • 在控制器中加载成员资格,这将简化第二个link_to。

答案 1 :(得分:0)

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