嘿伙计们,我需要你的宝贵帮助。在Ruby on Rails 教程的第 10 章中,作者在一个视图中有 2 个控制器。我构建了一个类似的应用程序,其中我在一个视图中也有 2 个控制器,但是,当我渲染一个属于第二个控制器的方法时,从第一个开始我就遇到了参数问题。(在教程中作者没有在其他控制器的动作中使用任何参数)
更具体地说,我有 2 个控制器:UsersController 和 MicropostsController。另外,在 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
内部用户控制器
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)在一个视图中有多个控制器是一种好习惯吗?我在网上找到了相互矛盾的答案。(实际上,我什至不确定这段代码是否仍然是 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
如果我在 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
当我点击发布按钮时,我在浏览器中什么都没有。此外,当我尝试查看 tha users/1 页面时,我收到以下错误(!!):
undefined method `[]' for nil:NilClass
任何帮助都将非常有价值!如果您需要任何其他信息,请告诉我!