1

次のモデルでセットアップされたプロジェクトがあります。それぞれ->が関係を表しますhas_many:

Users->Goals->Milestones

私のルートは次のMilestonesようになります。

  user_goal_milestones GET    /users/:user_id/goals/:goal_id/milestones(.:format)          milestones#index
                         POST   /users/:user_id/goals/:goal_id/milestones(.:format)          milestones#create
 new_user_goal_milestone GET    /users/:user_id/goals/:goal_id/milestones/new(.:format)      milestones#new
edit_user_goal_milestone GET    /users/:user_id/goals/:goal_id/milestones/:id/edit(.:format) milestones#edit
     user_goal_milestone GET    /users/:user_id/goals/:goal_id/milestones/:id(.:format)      milestones#show
                         PUT    /users/:user_id/goals/:goal_id/milestones/:id(.:format)      milestones#update
                         DELETE /users/:user_id/goals/:goal_id/milestones/:id(.:format)      milestones#destroy

私は Milestones コントローラーの多くの「関数」で、これを多く実行していることに気づきました。

def index do
    @user = User.find(params[:user_id])
    @goal = Goal.find(params[:goal_id])
end

def edit do
    @user = User.find(params[:user_id])
    @goal = Goal.find(params[:goal_id])
end

常に定義する必要がないように、コントローラーを変更するにはどうすればよい@userです@goalか? クラス定義ブロックの開始直後に、それらを一番上に直接配置しようとしましたが、うまくいきませんでした。

4

2 に答える 2

2

パラメータが常に同じである場合、このようなメソッドを作成できます

def set_user_and_goal
    @user = User.find(params[:user_id])
    @goal = Goal.find(params[:goal_id])

end

上部の before_filter に入れます

before_filter :set_user_and_goal

好きなアクションに設定します

before_filter :set_user_and_goal, :only => [:edit, :index]

編集:

また、顔に吹き飛ばされないようにするために、次のことができます。

@user = params.has_key?(:user_id) ? User.find(params[:user_id]) : nil

要求に応じて..次のようなことを行って、目標がユーザーに属していることを確認してください

@goals = @user.goals.find(params[:goal_id])
于 2013-04-14T04:15:20.813 に答える
1

常に独自のヘルパー メソッドを定義する

def goal_milestone(goal)
  user_goal_milestone(goal.user, goal)
end

これを application_helper に追加してから、任意のビューで any を使用できます。これにより、質問で尋ねた小さなヘルパー メソッドが作成されます。

これを行う宝石を探しても何も表示されませんでしたが、一般的な方法で自分でコーディングできます。

于 2013-04-14T04:15:05.710 に答える