Nano Hash - криптовалюты, майнинг, программирование

Rails 3 — Указание действия формы после отправки удаленной формы

У меня есть очень простая форма, которая отлично работает, пока я не попытаюсь отправить ее повторно. После чего он обновляет запись вместо создания новой:

На мой взгляд, у меня это:

#new_order_form
  = render 'form'

И моя форма частичная:

= semantic_form_for [@location, @order], :remote => true do |f|
  -if @order.errors.any?
    #notice{:class=>'alert alert-block alert-error fade in'}
      %a{:class=>"close", :data=>{:dismiss=>"alert", :href=>"#"}}
        x
      %h3  
        = pluralize(@order.errors.count, "error")
      - @order.errors.full_messages.each do |msg|
        = msg
        %br

  %table{:class => 'table table-bordered', :style=> {width: '50%'}}  
    %tr
      %td= f.text_field :product_order_id, :placeholder => "Order ID"

И в моем create.js:

$("#new_order_form").html("<%= escape_javascript(render("form")) %>");

Это отлично работает для создания заказа и отображает ошибки, если они существуют.

Проблема в следующем: если я ввожу другой номер заказа, не обновляя страницу, он обновляет ранее созданную запись, а не создает новую.

Глядя на код формы, я вижу, что действие отправки заменено обновлением.

Я попытался заменить код на это:

 = semantic_form_for [@location, @order], :remote => true do |f|
   #new_order_form
     = render 'form', :f => f

И это в create.js

$("#new_order_form").html("<%= escape_javascript(render :partial => 'form', :locals => {:f => @order}) %>");

Что тоже не работает и жалуется на недопустимое text_field.

Как лучше всего это сделать? Спасибо


  • Можете ли вы опубликовать действие создания вашего контроллера? представления кажутся прекрасными и выглядят так, как будто настоящим виновником является действие контроллера. 25.01.2013
  • Да, спасибо. Опубликую через несколько. Играл, но все еще не могу заставить его работать. Просто для подтверждения, @order_new должен находиться в разделе if xxxx.save? 25.01.2013

Ответы:


1

Я не эксперт по этой теме, но ответ Адама кажется правильным. Я предполагаю, что у вас есть что-то вроде ниже в вашем действии контроллера:

def create
  @order = Order.new(params[:order])

  if @order.save
    responds_to do |format|
      format.js
      format.html { redirect_to 'xxx' }
    end
  else
    responds_to do |format|
      format.js
      format.html { render :new }
    end
  end
end

если у вас есть вышеуказанная структура, то create.js.erb просто передает объект @order, который был изменен после вызова @order.save. Вы можете просто переопределить его в переданном условии следующим образом (проверьте строку № 4):

def create
  @order = Order.new(params[:order])

  if @order.save
    @order = Order.new
    responds_to do |format|
      format.js
      format.html { redirect_to 'xxx' }
    end
  else
    responds_to do |format|
      format.js
      format.html { render :new }
    end
  end
end

Теперь, если @order был успешно сохранен, будет создан и передан новый заказ. В противном случае будет передан старый @order с ошибками проверки. Надеюсь, это поможет.

26.01.2013

2

Проблема в том, что ваш create.js считывает @order, полученный в результате операции создания, который является существующим @order, поэтому он становится обновлением.

Одно исправление: создайте новый @order с помощью: @order_new = Order.new в разделе создания if @order.save.

Теперь скажите вашей частичной форме использовать порядок вместо @order с помощью:

semantic_form_for [@location, order], :remote => true do |f|

Обновите файл create.js следующим образом:

$("#new_order_form").html("<%= escape_javascript(render 'form', :order => @order_new) %>");

Обязательно обновите все, что ссылается на визуализацию формы, чтобы также использовать :order => @order. Например:

<%= render 'form', :order => @order %>

Если ваше @location должно быть новым экземпляром, применяются те же правила.

Я использовал @order_new вместо перезаписи @order на случай, если вы захотите что-то сделать с @order в своем create.js.

Примечание (для других зрителей): Метод рендеринга Rails 3.x не нуждается в помощниках partials => и locals =>.

20.01.2013
  • Эй, спасибо за ответ. Вы хотели навести порядок в части form_for или @order? 21.01.2013
  • заказ идет в части form_for. Вы хотите использовать @order_new, поэтому вы передаете его в частичную форму как порядок (:order => @order_new), таким образом, ваши new.html.erb и edith.html.erb могут использовать одну и ту же частичную форму, и они просто используют все, что им передается. 22.01.2013
  • Итак, это должно быть semantic_form_for [@location, order], а не semantic_form_for [@location, @order]? 22.01.2013

  • 3

    Я не знаком с semantic_form_for, но предполагаю, что это надмножество обычного form_for.

    Способ работы form_for заключается в том, что он проверяет модель, чтобы убедиться, что она сохраняется, а затем выполняет действия по умолчанию, чтобы соответствовать этому. Лично я предполагал, что вызов form_for из действия edit предполагает update, но это не так. form_for будет предполагать, что действие create для любой несохраняемой модели и update для любой сохраненной модели. Я уверен, что вы можете переопределить это, если хотите, но я не пробовал делать это сам.

    Похоже, вы показываете модель и пытаетесь создать новые модели на той же странице. (Если я ошибаюсь, укажите ваши контроллеры, потому что трудно сказать, что вы собираетесь делать.) Возможно, вам понадобятся как @show_order, так и @new_order в вашем контроллере.

    Я надеюсь, что это поможет, а если нет, возможно, вы можете предоставить более подробную информацию о своих контроллерах.

    Изменить:

    Всякий раз, когда вы хотите создать новую модель, вам нужно убедиться, что ваш контроллер вызывает @new_order = Order.new, а form_for вызывается с помощью @new_order. new_ — это просто префикс, чтобы отличить новый от старого.

    В этом случае я не уверен, был ли контроллер order#show или, может быть, успешной частью order#create.

    Для show вам нужно что-то вроде этого:

    @order = Order.find(params[:id])
    @new_order = Order.new
    

    Если вы делаете это из create, вы, вероятно, захотите:

    @order = Order.new(params[:order])
    
    if @order.save
      @new_order = Order.new
      redirect_to ???
    else
      render :new
    end
    

    Все вышеперечисленное должно в точности соответствовать стоковому контроллеру кроме добавления @new_order. (Другими словами, не удаляйте строки respond_to и format, если они есть.)

    16.01.2013
  • Привет Джефф, это немного помогает. Мой контроллер практически не изменился со стока - не знаю, как это повлияет. Можно было бы на примере. 17.01.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..