【发布时间】:2012-11-07 19:47:12
【问题描述】:
大家好,我需要您的宝贵帮助。在Ruby on Rails tutorial,第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 中发现了一个 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
任何帮助都会非常有价值!如果您需要任何其他信息,请告诉我!
【问题讨论】:
标签: ruby-on-rails controller render params