TJ Sherrill
TJ Sherrill

Reputation: 2645

Rails 3 routing error in a relationship in a has_many => through association

I have my models setup as follows:

 class User
 has_many :memberships, :dependent => :destroy
 has_many :groups, :through => :memberships

 Class Group
 has_many :memberships, :dependent => :destroy
 has_many :users, :through => :memberships

 Class Membership
 attr_accessible :user_id, :group_id
 belongs_to :user
 belongs_to :group

My MembershipController#create

def create
  @membership = current_user.memberships.build(:group_id => params[:group_id])
  if @membership.save
    flash[:notice] = "You have joined this group."
    redirect_to :back
  else
    flash[:error] = "Unable to join."
    redirect_to :back
  end
end

I have resources :memberships in my routes so that it can find the create action.

Finally in my Group#show action I want a user to be able to join a group. So I created this form_tag

<%= form_tag(membership_path) do %>
    <%= hidden_field_tag @group.id %>
    <%= submit_tag "Join Group"%>
<% end %>

This returns the following error:

Routing Error

No route matches [POST] "/memberships/1"

I have run a rake routes to try and understand what I am missing here:

memberships GET /memberships(.:format) {:action=>"index", :controller=>"memberships"} POST/memberships(.:format) {:action=>"create", controller=>"memberships"} new_membership GET /memberships/new(.:format) {:action=>"new",controller=>"memberships"} edit_membership GET /memberships/:id/edit(.:format){:action=>"edit", controller=>"memberships"}

membership GET /memberships/:id(.:format) {:action=>"show", :controller=>"memberships"} PUT /memberships/:id(.:format){:action=>"update", :controller=>"memberships"} DELETE /memberships/:id(.:format) {:action=>"destroy", :controller=>"memberships"}

Anyone see the error of my ways?

Upvotes: 0

Views: 394

Answers (3)

Saran
Saran

Reputation: 713

the path is "new_membership" right? new_membership_path if you are doing a form_tag.Or you can always use a form_for and render it through a partial in your view.

Upvotes: 0

Si1entSpike
Si1entSpike

Reputation: 324

Don't you want to be posting to memberships_path rather than membership_path? It looks like the error is indicating it can't find a POST route for a membership due to the fact that there is actually no route for :membership for POST, :only memberships.

Upvotes: 1

Gav
Gav

Reputation: 11460

My quick glance at this; shouldn't <%= form_tag(membership_path) do %> be <%= form_tag(@membership) do %>'or <%= form_tag(membership_path(@membership)) do %>.

Upvotes: 0

Related Questions