やあみんな私はあなたの貴重な助けが必要です。Ruby on Railsチュートリアルの第10章では、作成者は1つのビューに2つのコントローラーを持っています。1つのビューに2つのコントローラーがある同様のアプリを作成しましたが、2番目のコントローラーに属するメソッドをレンダリングすると、最初からパラメーターに問題が発生します。(チュートリアルでは、作成者は他のコントローラーのアクションでパラメーターを使用しません)
具体的には、UsersControllerとMicropostsControllerの2つのコントローラーがあります。また、Usersのshow.html.hamlページでは、ユーザーのマイクロポストを表示するためのUsersControllerと、ユーザーが新しいマイクロポストを作成できるようにするためのMicropostsControllerの両方のコントローラーを使用しています。
MicropostsControllerの内部:
def create
@micropost = current_user.microposts.build(params[:micropost])
if @micropost.save
flash[:success] = "Micropost created!"
redirect_to user_path(current_user)
else
#render text: renderActionInOtherController(UsersController,:show, {:id => 1})
@user = User.find(current_user)
@microposts = @user.microposts.paginate(page: params[:page])
render 'users/show'
end
end
UsersControllerの内部
def show
@user = User.find(params[:id])
@microposts = @user.microposts.paginate(page: params[:page])
@micropost = current_user.microposts.build if signed_in?
end
app / views / users/show.html.hamlで
- provide(:title, @user.name)
.users_page
.row
%aside.span4
- if !signed_in?
%section
%h1
= gravatar_for @user
= @user.name
- else
%section
= render 'shared/user_info'
%section
= render 'shared/micropost_form'
.span8
- if @user.microposts.any?
%h3 Microposts (#{@user.microposts.count})
%ol.microposts
= render @microposts
= will_paginate @microposts
したがって、基本的に私の質問は次のように要約されます。
1)1つのビューに複数のコントローラーを配置することは良い習慣ですか?ネットで矛盾する答えを見つけました。(実際、このコードがRESTfulのままであるかどうかさえわかりません)
2)1が「はい」の場合(または少なくともそれは悪い習慣ではありません)、同じことをより効率的な方法で実装できますか?私の見方では、別のコントローラーからアクションをレンダリングするたびに、変数を再定義する必要があります。
3) stackoverflowで同様のトピックを見つけました。このトピックでは、この方法を使用することを提案しています(RoRを初めて使用するため、正確にはわかりません)。
def renderActionInOtherController(controller,action,params)
controller.class_eval{
def params=(params); @params = params end
def params; @params end
}
c = controller.new
c.request = @_request
c.response = @_response
c.params = params
c.send(action)
c.response.body
end
このバージョンのcreateアクションをMicropostsController内で使用すると、
def create
@micropost = current_user.microposts.build(params[:micropost])
if @micropost.save
flash[:success] = "Micropost created!"
redirect_to user_path(current_user)
else
render text: renderActionInOtherController(UsersController,:show, {:id => 1})
#@user = User.find(current_user)
#@microposts = @user.microposts.paginate(page: params[:page])
#render 'users/show'
end
end
投稿ボタンを押すと、ブラウザに何も表示されません。さらに、users / 1ページを表示しようとすると、次のエラーが発生します(!!):
undefined method `[]' for nil:NilClass
どんな助けでも本当に価値があります!他の情報が必要な場合は私に知らせてください!