2011-11-12 11 views
0

私はバンドとコードとユーザーを持っています。Rails 3 has_many、インデックスアクションからオブジェクトとその関係を作成する方法

キー/コードは、ユーザーがバンドで何かをすることを可能にします。私はバンド#ショーの活動におり、コードを生成し、そのコードをユーザーとバンドに関連付ける必要があります。そう

コードがBELONGS_TO:バンド、belongs_toの:ユーザー バンドにhas_many:コード ユーザーにhas_many:コード

だから今、私は時にボタンを作成する(と思う)のform_forを使用する必要がありますがユーザーがそのバンドでコードを持っている場合

ない場合(ユーザーがバンドごとに一つのコードを持つことができます)

チェック:

プレスは、以下のことを行います
  • は6桁の英数字キー/コードを作成する(Iはactivesupportのが それ行うことができます知っている:<% = SecureRandom.hex(3)%>が、これはモデルまたは コントローラにする必要がある)を設定
  • このコードはこのユーザーとこのバンドで動作します。私は、ユーザーが既にそのバンドのためのコードがある場合、それらは、「エラーを与えられているので、私は アクションをCURRENT_USER方法
  • へのアクセス権を持っているし、バンド#ショーにユーザーを返す

を考案を使用していますあなたはすでに私が最終的にページをリロードするからではなく、今の私はちょうど機能を構築しようとしています保つためにAjaxでこの呼び出しを作りたいコード」

を持っています。あなたのバンド/ユーザーコードで

+1

RoRのドキュメンテーションの関連性を確認してください。http://guides.rubyonrails.org/association_basics.html – marimaf

+0

私はそれをしました。それが役に立ちましたが、それに基づいてモデルを構築できたので、私は次のステップで苦労しています。いくつかの方向でさえクールだ、私はどのような種類のものを探す必要がありますか? –

答えて

0

まず、ルートに次のルートを作成します。RB:

resources :bands do 
    post :add_code, :on => :member 
end 

これは、このように見て、追加ルートを作成します。

add_code_band_path POST /bands/:id/add_code(.:format) {:action=>"add_code", :controller=>"bands"} 

次に、あなたの意見から、あなたがこのようなPOSTリクエストを送信するためにbutton_toヘルパーメソッドを使用することができます。

<%= button_to "Add Code", add_code_band_path(@band), :method => :post %> 

ユーザーがそのボタンをクリックすると、コントローラのアクションから残りの部分を次のように処理できます。

class BandsController < ApplicationController 
    ... 

    def add_code 
    @band = Band.find(params[:id]) 
    @code = current_user.codes.find_or_create_by_band_id(@band.id) 
    render :action => :show 
    end 

最後に、私はこのような規範モデル自体からbefore_createコールバックから生成される実際のランダム化されたコード:

class Code < ActiveRecord::Base 
    ... 

    before_create :generate_code 

private 
    def generate_code 
    self.code = SecureRandom.hex(3) 
    end 
end 

は、その後、あなたはそれが必要だと思うならば、あなたものみ示すような他の検証を追加することができますコードがない場合は[コードを追加]ボタンをクリックし、ユーザーが同じバンドの別のコードを追加しようとするとエラーメッセージを追加することがありますが、残しておきます。 button_toヘルパーはまた、:remote => trueを使ってAjaxをサポートしていますので、あなたはそれをさらに発展させることができます。

+0

ダン、これは大きな助けです。私はこれを行う方法を見て苦労していた、これはそれを行います。私が見ることができる唯一の問題は、コードを作成していないようです。コントローラーのshowアクションに@code = Code.newを追加する必要がありますか? –

+0

私はfind_or_create_byについてもっと掘り下げました。申し訳ありません。私はそれに十分に足りないかもしれないと思います。 http://api.rubyonrails.org/classes/ActiveRecord/Base.htmlより多くのメソッドを渡す方法について... –

+0

私はこのわずかな変更で私の問題を解決できました:find_or_create_by_band_id(@ band.id、:user_id = > current_user.id) –

0

試しにhas_many:

までは、あなたは、テーブルを結合し、結合モデルを作成する必要がありますが、私はそれはあなたが探しているものだと思います。

関連する問題