我有一个通过远程 => true 将行添加到数据库的表单。然后我想将新数据附加到表中,但无法获得要呈现的正确 View 。
截至目前,它正在为新条目呈现整个 show.html.erb 页面,但我想布局一个最小版本以添加为 .有没有一种快速的方法可以告诉我的 Controller 在插入数据库后要呈现什么 View ?我想渲染我命名的部分 _newly_added.html.erb
我的 Controller
def new
@task = Task.new
render :partial => "/tasks/newly_added", :locals => { :t => @task }
end
谢谢!!
编辑 我认为我需要的只是另一种“显示” View 。
我发现我需要改的方法其实是这样的:
def create
@task = Task.new(params[:task])
respond_to do |format|
if @task.save
format.html { redirect_to @task, notice: 'Task was successfully created.' }
format.json { render json: @task, status: :created, location: @task }
else
format.html { render action: "new" }
format.json { render json: @task.errors, status: :unprocessable_entity }
end
end
end
我只需要制作一个替代的显示 View ,然后告诉它重定向到那个 View 。
最佳答案
根据您问题中的更改进行编辑。然而,并没有真正改变。你的想法是错误的,需要调整你的想法。您不需要替代节目,您需要处理 format.js 请求。
部分应该在 JavaScript 响应中呈现,而不是 Controller 。 Controller 看起来更像这样:
def create
@task = Task.new(params[:task])
respond_to do |format|
if @task.save
format.html { redirect_to @task, notice: 'Task was successfully created.' }
format.json { render json: @task, status: :created, location: @task }
format.js
else
format.html { render action: "new" }
format.json { render json: @task.errors, status: :unprocessable_entity }
format.js
end
end
end
然后,在 views/tasks/create.js.coffee 中
($ '#mytable').append("<%= j render(partial: 'tasks/newly_added', locals: { t: @task }) %>")
这里发生的事情是浏览器调用 create.js
。由于 respond_to
block 的 format.js
, Controller 使用 create.js
模板进行响应。 j
对 _newly_added.html.erb
文件的内容进行转义,并将其内容附加到表中。 Controller 不与现有 View 交互,而是将 JavaScript 发送到浏览器,并与 View 交互。
如果您使用客户端 MVC 框架(如 Backbone 或 Ember),这一切都会有所改变,但您没有指定,所以我假设您使用的是标准 Rails。
关于ruby-on-rails - 从 rails 中的 Controller 渲染部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13367426/