这发生在我身上好几次了,我还没有找到一个可接受的解决方案。在Ruby on Rails中运行另一个控制器操作
我在一个网站的主页上有一个窗体,它指向另一个控制器,它实际上处理数据。当表单提交成功后,另一个控制器会发送回到主页,并带有一个不错的flash [:notice]消息,这就是结束了。
当出现验证问题时,它就成了问题。我想要做的是显示带有验证错误的表单。通常提到的天真的解决方案是您可以渲染另一个模板,但显示主页不仅仅是渲染模板,它还有很多功能。渲染该模板的唯一方法是在此其他控制器操作中复制和粘贴功能,或者可能将所有功能从控制器中分离出来,这不是很好,或者
有更好的解决方案吗?
更新:我明白有人说控制器操作应该更小,并调用另一种方法,但在实践中,我看不到如何实现它。我要从我做的一个网站上发布一个真实的例子。
有两种模型和控制器:帖子和评论。一个职位有很多原因。一个后显示是这样的:
def index
set_posts # sets @posts
end
def show
@post = Post.find_by_slug(params[:id])
@comment = Comment.new
if not @post
flash[:error] = "'#{params[:id]}' does't exist"
set_posts
render :action => :index, :status => :not_found
end
end
private
def set_posts
@posts = Posts.get_all_public_posts
end
的意见控制器只有创建操作:
def create
@comment = Comment.new(params[:comment])
@comment.post = Post.find_by_slug params['post_id']
if not @comment.post
# Now what?
# We should here call PostsController.set_posts and render views/posts/index
end
if @reason.save
flash[:notice] = 'Thank you for your message.'
redirect_to(@reason.item)
else
# Now what?
# We should here call PostsController.show without overriding the @comment
end
end
末
的 “?现在是什么”部分是我没有很好的解决方案。
不同之处在于,渲染已包含在主页操作中的表单需要很多控制器逻辑。 – EmFi 2010-02-25 05:26:04
重新渲染表格丢失了家庭控制器操作中的大约25行代码。 – Pablo 2010-02-25 05:26:53