嘿,我需要你们宝贵的帮助。在Ruby on Rails tutorial,在第10章,作者在一个视图中有2个控制器。我构建了一个类似的应用程序,其中我在一个视图中也有2个控制器,但是,当我呈现属于第二个控制器的方法时,从第一个控制器出现问题。 (在教程中,作者没有在其他控制器的操作中使用任何参数)在一个视图中的多个控制器(ruby on rails MVC)
更具体地说,我有2个控制器:UsersController和MicropostsController。另外,在用户的show.html.haml页面中,我使用两个控制器:UsersController来显示用户的micropost和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
在应用程序/视图/用户/ 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)在一个视图中有多个控制器是一个好习惯吗?我在网上发现了矛盾的答案。 (实际上,我甚至不确定这段代码是否仍然是RESTful)
2)如果1是(或者至少这不是一个坏习惯)我能否以更高效的方式实现相同的功能?因为我看到它的方式,每次我从另一个控制器渲染动作,我都必须重新定义变量。
3)在stackoverflow中发现一个similar主题,其中一个人提议使用此方法(由于我是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
如果我使用这个版本里面创建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
时,我打按钮后,我得到在浏览器中完全没有。此外,当我尝试查看用户/ 1页时,出现以下错误(!!):
undefined method `[]' for nil:NilClass
任何帮助都将非常有价值!如果您需要任何其他信息,请通知我!