Я новичок в JSON и пытаюсь создать многостраничную AJAX-форму с его помощью

#ruby-on-rails #select

#ruby-on-rails #выберите

Вопрос:

Заранее прошу прощения за то, что это звучит глупо, но недавно я обнаружил JSON в Rails, и мне действительно интересно создать форму, которая разбита на несколько страниц. Затем данные будут передаваться со страницы на страницу через объект JSON.

Я застрял на том, как правильно это сделать.

Моя первая страница формы — это :

Первая страница

Контроллер:

 def create
  # removed some code here for the sake of simplicity
  if @card_signup.save
    respond_to do |wants|
      wants.html {}
      wants.json { render :json => { :html => (render_to_string :partial => 'final_form')}}
    end
  else
    respond_to do |wants|
      wants.html { render :new }
      wants.json { render :json => { :errors => @card_signup.errors } }
    end
  end
end
  

Javascript, который обрабатывает сохранение первой формы на этом контроллере

 $(".step_two_submit").click(function(){

  $("#new_card_signup").attr("action", function(index, action) {
    var values = [],
        getKey;

    $("#sortable").sortable('serialize').replace(/(w ?)[]=(d ?)/g, function(all, key, number) {
        values.push(number);
        getKey = key;
    });

    var cardSignupGetParams = 'card_signup='   getKey   '['   values.join(', ')   ']';
    return action   '?'   cardSignupGetParams   "amp;foo[]=bar";
  });

});
  

Вот это сложная часть! Я хочу сделать так, чтобы я проверял, была ли эта форма написана правильно, как обычно. Нет проблем, форма настроена для этого. Но когда они нажимают «Далее», я хочу, чтобы они перешли ко второй форме, которая представляет собой отказ от ответственности, с которым они должны согласиться, прежде чем объект будет сохранен.

Поэтому, если они откажутся или не одобрят отказ от ответственности, объект никогда не будет создан.

Для достижения этой цели.. Я предполагаю, что мне нужно вместо того, чтобы сохранять объект, мне нужно сохранить объект в JSON object и перенести его через AJAX на эту следующую страницу отказа от ответственности, загруженную AJAX.

Кто-нибудь знает, как я мог бы объединить это вместе?

Опять же, я прошу прощения, если это не имеет особого смысла.

Ответ №1:

Что вы действительно хотите сделать, так это проверить объект перед переходом ко второй части страницы. Если вы определенно хотите совершить обратный переход к серверу, вы можете использовать @card_signup.valid? вместо @card_signup.save в контроллере вашего действия «проверить», а затем просто скрыть элементы формы с помощью javascript и показать свой отказ от ответственности. Таким образом, вы все еще проверяете, что она будет сохранена при окончательной отправке, но фактически не сохраняете ее в базе данных.

Другим способом сделать это без javascript было бы отправить первую страницу действию контроллера, которое только что проверило наличие допустимого объекта, и перейти на вторую страницу, которая затем отображает большинство элементов формы как скрытые элементы, эффективно перенося заполненную форму на вторую страницу без ее сохранения.

С другой стороны, вы можете выполнять проверку на стороне клиента в максимально возможной степени и не обращаться к серверу. Смотрите railscast Проверки на стороне клиента, чтобы узнать интересный и простой способ сделать это.

Комментарии:

1. Я думаю, мой вопрос больше соответствовал тому, как передать объект json из действия контроллера в действие. Я не совсем уверен, как это сделать или каким будет его синтаксис.

2. Этот вопрос не имеет смысла. Что вы имеете в виду под действием контроллера к действию.

3. Классный джамураа, в итоге я сделал то, что ты сказал, и это действительно помогло в долгосрочной перспективе. Я был немного зациклен на том, как AJAX должен был быть собран более технически. Я с нетерпением жду, когда Rails добавит aJAX в свою систему.