【问题标题】:submit a form and update page with Rails and AJAX使用 Rails 和 AJAX 提交表单和更新页面
【发布时间】:2015-06-27 16:16:17
【问题描述】:

在索引页面上,我有一个创建新对象的表单。在提交表单时,我想用新对象更新页面而不刷新页面。表单提交并创建了对象,但页面未更新。表单被隐藏,这是所需的效果,但新对象不显示。日志将堆栈跟踪显示为

Started POST "/products" for ::1 at 2015-06-27 18:38:14 +0100
Processing by ProductsController#create as JS
Parameters: {"utf8"=>"✓", "product"=>{"name"=>"Pets"}, "button"=>""}
User Load (1.4ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1  [["id", 2]]
(0.2ms)  BEGIN
SQL (0.4ms)  INSERT INTO products" ("name", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id"  [["name", "Pets"], ["created_at", "2015-06-27 17:38:14.418558"], ["updated_at", "2015-06-27 17:38:14.418558"]]  
(6.1ms)  COMMIT
(0.4ms)  SELECT COUNT(*) FROM "items" WHERE "items"."product_id" = $1    [["product_id", 83]]
Rendered products/_product.haml (1.4ms)
Rendered products/create.js.erb within layouts/admin (2.7ms)
Rendered products/index.haml within layouts/admin (12.8ms)
Rendered layouts/_shim.html.erb (0.1ms)
Rendered layouts/_header.haml (0.6ms)
Rendered layouts/_footer.haml (0.1ms)
Completed 200 OK in 139ms (Views: 134.7ms | ActiveRecord: 2.1ms)

表格在 index.haml 中

%div{class: "col-md-4 col-md-offset-2 product-list"}
  - @products.each do |product|
    = render 'product', product: product

%div{class: "col-md-4"}
  .btn.btn-success.btn-sm.add-product
  Add a product

.add-product-form
  = form_for @product, remote: true, html: {class: "product disabled"} do |f|

  .product-add
    .form-group
      = f.label :name 
      = f.text_field :name, class: "form-control"
    .form-group
      .controls
        = f.button '+ Add', class: 'btn btn-success save-product'
        .btn.btn-warning.product-cancel
          Cancel

products.js.coffee

$ ->
  $(document).on "click", ".save-product", ->
    $('.add-product-form').hide()

products_controller.rb

def create
  @product = Product.new(product_params)
  if @product.save
    respond_to do |format|
      format.html
      format.js
    end
  end
end

create.js.erb

$(".product-list").append("<%= j render 'product', product: @product} %>");

_product.haml

%h4
  = link_to product_url(product.id) do
    = product.name.capitalize

我对 js/coffeescript 还很陌生。如何让视图更新为我可以看到已保存的新项目?

【问题讨论】:

  • 错误出现在哪一行?
  • _product.haml 的第 2 行
  • 很难确定,但我认为当您调用此行 $(".product-list").append("&lt;%= j render 'product', locals: {product: @product} %&gt;"); 时,您所做的是将产品类而不是实例传递到模板中。

标签: ajax ruby-on-rails-4


【解决方案1】:

你js里的render line不对,要么写

render 'product', product: @product

或者写

render partial: 'product', locals: { product: @product }

【讨论】:

  • 好地方,我也发现了。所以现在我没有收到任何 500 错误或任何错误。但是没有展示新产品。
  • 替代方法,不是通过 Rails 提交,而是通过页面的 AJAX 请求提交,然后在 rails 端执行render :json =&gt; { results =&gt; (render_to_string partial: "product", locals: {product: @product}) } 并让您的 JavaScript 解释将该响应附加到页面。也许是个人喜好,但使跟踪比特更容易。
  • Margo:从您显示的代码看来一切正常。要查找的内容:1)jquery 选择器不返回任何内容(但看起来还可以),2)javascript 代码中有错误。测试这个的简单方法:在浏览器中打开控制台,打开网络选项卡,执行 ajax,单击请求,复制响应并在 javascript 控制台中运行响应:然后您将看到错误。祝你好运!
  • @Kirill: 意思是在js端渲染视图,是完全不同的方式,不是简单的切换。恕我直言,像这样的简单案例仍然像 Margo 现在处理它一样容易。
  • thx @nathanvda,响应是 $('.category-list').append("

    \n localhost:3000/categories/118\">猫\n \n (0)\n \n \n\n") 引发语法错误,未终止的字符串文字,我不知道怎么解决

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2013-12-08
相关资源
最近更新 更多