从rails中的控制器渲染部分

Posted

技术标签:

【中文标题】从rails中的控制器渲染部分【英文标题】:Rendering a partial from a controller in rails 【发布时间】:2012-11-13 19:32:20 【问题描述】:

我有一个通过远程 => true 向数据库添加行的表单。然后我想将新数据附加到表中,但无法获得要呈现的正确视图。

到目前为止,它正在为新条目呈现整个 show.html.erb 页面,但我想布局一个最小版本以添加为 .有没有一种快速的方法来告诉我的控制器在插入数据库后要呈现什么视图?我想渲染我的部分名为 _newly_added.html.erb

我的控制器

  def new
    @task = Task.new
    render :partial => "/tasks/newly_added", :locals =>  :t => @task 
  end

谢谢!!

编辑 我认为我需要的只是另一种“展示”视图。

我发现我需要改变的方法其实是这样的:

  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

我只需要制作一个替代的显示视图,然后告诉它重定向到那个视图。

【问题讨论】:

您可以只拥有一行tr 的一部分并在其中渲染新对象。然后,您可以获取 Ajax 调用的响应数据并将生成的 html 放入表中。为此,请使用不带布局的 respond_to :js 并使用特定的部分 【参考方案1】:

根据您问题中的更改进行编辑。然而,什么都没有真正改变。你的想法是错误的,需要调整你的想法。您不需要替代节目,您需要处理 format.js 请求。

部分应该在 javascript 响应中呈现,而不是在控制器中。控制器看起来更像这样:

  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 块的format.js,控制器响应create.js 模板。 j 转义了_newly_added.html.erb 文件的内容,并将其内容附加到表中。控制器不与现有视图交互,而是将 JavaScript 发送到浏览器,并与视图交互。

如果您使用的是 Backbone 或 Ember 等客户端 MVC 框架,这一切都会有所改变,但您没有指定,所以我假设您使用的是现有的 Rails。

【讨论】:

我对原始问题进行了一些编辑,我想我已经找到了现在需要发生的事情,但我无法弄清楚语法。 与 new 一样,与 create 一样。没有什么真正改变,但我已经调整了对您编辑的问题的回答。 我之前曾尝试过,但没有成功,但在看到您的帖子后重新修改它,它成功了。谢谢! 没问题!您可能想看看 Ryan Bates 在此方面的出色 railscast:railscasts.com/episodes/136-jquery-ajax-revised ... Pro 会员资格是我每个月花的最好的 9 美元。 我会补充说你必须使用这样的东西:***.com/a/5731237/458177 才能获得完整的布局!

以上是关于从rails中的控制器渲染部分的主要内容,如果未能解决你的问题,请参考以下文章

Rails 4:部分渲染后无法使用javascript(使用ajax)

如何在rails中渲染这个部分

(rails) 从 DB 中获取并渲染成 HTML

js.erb 不在 Rails 6 中渲染

Rails -> 部分视图的操作方法

Rails:从另一个控制器渲染 .js.erb?