#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 в свою систему.