2012-04-07 1 views
0

私はRailsアプリケーションで作業しています(私のRailsスキルは錆びています)。私は現在、User、Account、Collaborator(User * - * Accountからのテーブルの結合)とProjectという4つのモデルを持っています。各ユーザーは多くのプロジェクトを持つことができる多くのアカウントを持つことができます。私は現在、適切なアカウントのプロジェクトを作成することにいくつか問題があります。私の目標は、ユーザーアカウント(企業とも呼ばれる)とアカウントプロジェクトを同じページに表示し、プロジェクトに同じページでアクションを作成させることです。このような何か:Rails:多対多の関係の「選択された」オブジェクトからオブジェクトを構築する

Logo 

(current_user) Account 1 (ie. Company account) 
    Account Project 1 
    Account Project 2 
    text_field for creating new projects for Account 1 + submit button 

(current_user) Account 2 (ie. My fun hobby projects) 
    Account Project 1 
    Account Project 2 
    text_field for creating new projects for Account 2 + submit button 

私が作成し、ユーザーアカウントに問題を持っていないが、私はアカウントのプロジェクトを作成するための上記の結果を達成する方法がわからないと思います。私はこのような新しいプロジェクトを作成するためにつまずく試みを行った

class Account < ActiveRecord::Base 
    [...] 
    has_many :projects, dependent: :destroy 
    [...] 

class Project < ActiveRecord::Base 
    [...] 
    belongs_to :account 
end 

class ProjectsController < ApplicationController 
    [...] 
    def create 
    # How do I find the selected/correct account? 
    @project = "selected_account".projects.build(params[:projects]) 
    if @project.save 
     flash[:success] = "Project created!" 
     redirect_to root_path 
    else 
     render 'pages/home' 
    end 
    end 

私の質問は、おそらくオフに狭めることができる

モデルやアカウントとプロジェクトのための関係は次のようになりますProjectControllersで選択した/正しいアカウントでアクションを作成するにはどうすればよいですか?

すべての回答、指針またはヒントは素晴らしいでしょう。

ありがとうございました。

resources :accounts do 
    resources :projects 
end 

チェック路線ルートに

..fromを追加

+0

これはレール固有であるため、ルビーを削除すると書かれています –

答えて

1

あなたは現在ログインしているユーザーを返す「現在のユーザー」の方法を持っていると仮定すると、あなたのような何かを試みることができますコマンドラインdo 'rake routes'

account_projects GET /accounts/:account_id/projects(.:format)  projects#index 
       POST /accounts/:account_id/projects(.:format)  projects#create 

POST/accounts/1/projects

class ProjectsController < ApplicationController 
    [...] 
    def create 
    account = current_user.accounts.find params[:account_id] 
    @project = account.projects.build(params[:projects]) 
    if @project.save 
     flash[:success] = "Project created!" 
     redirect_to root_path 
    else 
     render 'pages/home' 
    end 
    end 
end 
+0

ありがとう、私には関連する1つの質問があります。私はあなたのアプローチを試みましたが、別のコントローラの "home"アクションに移動しました: 'account = current_user.accounts.where(:id => 1) @project = account.projects.build signedin?'(: id => 1はテスト用です)。しかし、私は上記のような関係を設定したにもかかわらず、 ''の '未定義のメソッド' projects 'を取得しました。なぜそれが分かっていますか?ありがとう。 – Anders

+0

apiを確認して、レールコンソールで再作成できるかどうか確認してください –

+0

答えとコメントをありがとう。私はあなたが指摘したのとほぼ同じ解決策でaccount_idに渡す隠しフィールドを使用することに決めました: 'account = current_user.accounts.find(params [:project] [:account_id]) @project = account.projects .build(params [:project]) 'を実行します。しかし、 "The Rails Way"によると私の解決策が正しいかどうか分かりません。その目的のために別の質問をするかもしれません。しかし、ありがとう! – Anders

関連する問題