Rails 问个小白问题,在 view 中,如何 render 其他的 action 内容呢?

lukefan · 2012年06月03日 · 最后由 lukefan 回复于 2012年06月04日 · 7154 次阅读

在 controller 里面,好像是可以 render 其他 action 的内容的。 我现在需要在 view 里面做同样的使用,而且还需要传一个 ID 过去。 试过了全路径名,试过了 :action,也试过了 :file = 全路径名 都报错,以前应该是搞过的,搞不清应该如何搞定了。

请帮帮忙。

2.2.3 Rendering an Action’s Template from Another Controller

What if you want to render a template from an entirely different controller from the one that contains the action code? You can also do that with render, which accepts the full path (relative to app/views) of the template to render. For example, if you’re running code in an AdminProductsController that lives in app/controllers/admin, you can render the results of an action to a template in app/views/products this way:

render 'products/show'

Rails knows that this view belongs to a different controller because of the embedded slash character in the string. If you want to be explicit, you can use the :template option (which was required on Rails 2.2 and earlier):

render :template => 'products/show'

http://guides.rubyonrails.org/layouts_and_rendering.html

怎么会需要在 view 里面去 render action? 这么做是不对的.... 楼主需要重新设计....

我现在的问题是,render :file 和 :template 应该如何写参数呢? 之所以要在 view 里面 render 一部分内容,是因为这个模块需要反复的使用,而且可能会通过 jquery 直接 get,所以没有写成 _view 的形式。

朋友这些都是 guide 里写的很清楚的啊... render :edit render :action => :edit render 'edit' render 'edit.html.erb' render :action => 'edit' render :action => 'edit.html.erb' render 'books/edit' render 'books/edit.html.erb' render :template => 'books/edit' render :template => 'books/edit.html.erb' render '/path/to/rails/app/views/books/edit' render '/path/to/rails/app/views/books/edit.html.erb' render :file => '/path/to/rails/app/views/books/edit' render :file => '/path/to/rails/app/views/books/edit.html.erb'

#3 楼 @lukefan jquery 去 get 另外一个 action 吗? 那你得拿数据用 js 来渲染啊...

#4 楼 @poshboytl 这里面没有任何一种是有参数的。我现在需要的是:render 'books/edit/23' 实在不行就不 render 了,直接试试 js 做 html 替换吧。

#6 楼 @lukefan render 本身是渲染一个模板,并不执行 action,你这种就已经传了参数给 action,然后返回的结果。这个只能 redirect_to.

#7 楼 @bony 在 view 里面怎么处理呢?局部渲染能够 redirect_to 吗?

#8 楼 @lukefan 局部渲染就用 ajax。你不妨把你逻辑说一下,看看有没有更好的办法。

我希望在主从表的主表编辑界面里面,将从表一起处理掉。我已经使用 jquery-ui 的 dialog 实现了创建子表内容,现在需要在主表的_form 里面显示一下所有元素。而且,是在每次调整了子表的内容之后,都需要局部刷新。

ajax.。。。别用 render 什么的了,直接用 json,前台用 js 处理。或者直接弹个 window,redirect_to 到你从表的编辑页面(看起来傻一点,不过简单。)

看来只能直接 get json 回来自己画了。 另外还有一个问题,当主表的记录是新建的,这个时候从表如何处理呢? 使用的是 mongoid,从表是嵌入的。 我做过尝试: '''ruby event = Event.new event.new? #=> true aganda = event.agandas.new event.new? #=> true aganda.new? #=> true aganda.save aganda.new? => false event.new? => false ''' 要是将所有信息在主表提交之前都存在隐藏字段里面,感觉很烦啊。

Mongoid 我不是很清楚,不过大致也就是这个思路。可以用 callback 处理从表的保存,after_save 之类的。这个你应该@huacnlee 问问。
by the way, 那个代码的点是波浪号下面的那个点。。是这个```.

event = Event.new
event.new? #=> true
aganda = event.agandas.new
event.new? #=> true
aganda.new? #=> true
aganda.save
aganda.new? => false
event.new? => false

测试一下,不过 windows 笔记本键盘上好像没有看到那个波浪号啊,苹果键盘是有的。

@lukefan Esc 下面的那个键。。要切换到英文输入下。。

#15 楼 @bony Esc 下面就是 1 了。

这必须是你用的框架不对。如果只需要后台编辑的话,必须用 Django 的 Admin 搞定。比如像下面这样,10 分钟的事嘛。

events/models.py

from django.db import models
from django.utils.translation import ugettext_lazy as _


class Event(models.Model):
    name = models.CharField(_('name'), max_length=255)

    class Meta:
        verbose_name = _('event')
        verbose_name_plural = _('events')


class Meeting(models.Model):
    event = models.ForeignKey(Event, related_name='meetings')
    start_time = models.DateTimeField()
    end_time = models.DateTimeField()

    class Meta:
        verbose_name = _('meeting')
        verbose_name_plural = _('meetings')
        ordering = ('start_time', )

events/admin.py

from django.contrib import admin

from events.models import Event, Meeting

class MeetingInline(admin.StackedInline):
    model = Meeting
    extra = 3

class EventAdmin(admin.ModelAdmin):
    inlines = [MeetingInline]


admin.site.register(Event, EventAdmin)
admin.site.register(Meeting)

#17 楼 @bhuztez 这里不是 ruby 社区的 rails 板块吗? 怎么来搞 python 啊? 有人来踢馆啊!

#18 楼 @lukefan 干活要选择合适的工具啊

建议你看一下 Django 的 Tutorial ,第二部分说的就是你现在这个问题。 https://docs.djangoproject.com/en/1.4/intro/tutorial02/

#17 楼 @bhuztez 好给力的行为艺术.... :D

@poshboytl 求同存异么啊。分流一部分去 python 也挺好的,大家选择自己喜欢的么。我一开始也是用了 Python 和 Django 又和 Ruby on Rails 对比了一下才选择了我比较喜欢的 rails.要给人选择的权利嘛。

真希望今年的 RubyConfChina 2012 和 PyCon 2012 一起办,不过可能性很小,呵呵。

楼主需要整理思路,view 里面是不会回头去调用 action 的,但是 view 之间可以通过局部模板共用页面代码。

如果是普通的嵌套表单,可以通过 render :partial => 'sub_obejct/form' 的形式把别的资源的 _form.html.erb 内容嵌套过来。(还要注意局部模板里面的变量)

如果需要 ajax 处理嵌套表单,可以用 js.erb 方式,也是在 js.erb 里面 render :partial => 'sub_obejct/form',然后把渲染出来的局部模板 insert 到页面上。

如果调用 ajax 表单的地方不止一个,就要用 json api,把表单逻辑交给客户端。

我估计楼主需要的是这个。。。 http://rubygems.org/gems/cells

非常感谢,最终决定放弃这种方式了。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号