2012-02-08 12 views
0

メンバーフォーム(new.html.erb)に入力した名前に基づいてユーザーのメンバーシップを作成しようとすると問題が発生します。ユーザーとグループ間の結合アクションを正しく作成する

user.rb

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

membership.rb

class Membership < ActiveRecord::Base 
    attr_accessible :user_id, :group_id 
    belongs_to :user 
    belongs_to :group 
end 

group.rb

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

会員コントローラ

def create 
     @group = Group.find_by_name(:group) 
     @membership = current_user.memberships.build(:group_id => @group.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 

会員 - _form.html.erb

<%= form_for(@membership) do |f| %> 
    ... 
    #error validation 
    ... 

    <div class="field"> 
    <%= f.label :group %><br /> 
    <%= f.text_field :group %> 
    </div> 

    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

私はそれがやりたいことは、それが存在する場合は、入力されたグループを見つけ、そしてメンバーシップのテーブルエントリを作成していますそれに応じてテーブル。私がやっていることが正しい方向にあるかどうかは分かりません。助言がありますか?

+0

あなたが持っているコードを使用して何が悪いですか?ログにエラーはありますか? – Brandan

+0

グループテーブルからgroup_idが見つかりません。私に "undefined method' group_id 'for nil:NilClass "というエラーを出す。私はそれがフォームまたはコントローラで問題があるかどうか分かりません – Norto23

答えて

1

あなたのコードは、現在動作していない理由があるため、この行は次のとおりです。

@group = Group.find_by_name(:group) 

それは誤りがあるようなもの(私は正確に申し訳ありません覚えていない)

@group = Group.find_by_name(params[:membership][:group]) 

する必要があります@groupnilなので次の行に呼び出されます。

しかし、仮想アトリビュートなどでモデルのロジックを処理する必要があります。

membership.rb

def group_name 
    if self.group 
    @group_name ||= self.group.name 
    end 
end 

def group_name=(group_name) 
    @group_name = group_name 

    self.group = Group.find_by_name(@group_name) 
end 

フォーム

<div class="field"> 
    <%= f.label :group_name, "Group" %><br /> 
    <%= f.text_field :group_name %> 
</div> 

コントローラ

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

優れた、単一行@group = Group.find_by_name(params [:membership] [:group]) は私が感謝のために探していたものでした – Norto23

関連する問題