Как сделать AJAX-вызов в разные домены в Ruby on Rails 3.0 - PullRequest
0 голосов
/ 13 августа 2011

У меня есть действие email в моем контроллере приложения, работающего на www.example.com, и я пытаюсь отправить данные формы email на www.data.example.com/email, где мое другое приложение получает запрос, и я могу сохранить данные в формате js. Но я хочу отправить подтверждение обратно на www.example.com и заменить html, используя шаблон rjs. Вот код для справки:

email.html.erb позвонил www.example.com

   <div id="div_content">
    <%= form_for(@user, :url => "http://data.example.com/mail", :remote => true) do |f| %>
    <%= f.label :email %>
    <%= f.text_field :email%>
    <% end %>
   </div>

электронная почта действие приложения на: data.example.com/email -

def email
  @user = User.create(params[:user])
  respond_to do |format|
    if @user.save!
       format.html { redirect_to(user_page_path(@user.vip_id), :notice => 'Thank you! You are now on our priority list.') }
       format.js
    else
       format.html { render :text => "user can not be saved at this moment!"}
    end
  end
end

email.js.rjs позвонил www.data.example.com / email

page.replace_html :div_content, :partial => "show", :object => @user

Я вижу в своем журнале, что запрос поступает от одного домена к поддомену, и даже запускается действие, но я не могу получить ответ обратно в основной домен. Итак, есть ли способ отправить обратный звонок в основной домен. Я просто хочу отразить изменения в форме, которая находится внутри div_content div, и хочу заменить ее содержимым _show.html.erb, которое есть в моем поддомене.

Большое спасибо,
Сурья:)

Ответы [ 2 ]

1 голос
/ 13 августа 2011

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

Самый простой (но не самый безопасный) способ, которым можно было бы добавить это в начало списка.Контроллер, которому вы отправляете данные:

protect_from_forgery :except => :email

RE КОММЕНТАРИИ

Аа, я вижу, я не обращал очень пристального внимания, когда впервые прочитал ваше сообщение, извините за это.Я пропустил все части о rjs.

Я, конечно, не эксперт по rjs, но похоже, что вы все делаете правильно.Единственная подозрительная часть для меня - это строка:

page.replace_html :div_content, :partial => "show", :object => @user

Я думаю, это должно быть:

page.insert_html(:bottom, "div_content", :partial => "show")

Также вы можете попробовать заменить шаблон rjs на

page.alert("debug");

Просто чтобы убедиться, что он действительно не вернется, потому что я подозреваю, что это ...

0 голосов
/ 26 августа 2011

Ребята, вот что я должен сделать, чтобы это заработало -

Ну, я пытался установить междоменную связь, используя мое приложение RoR, как я уже упоминал прямо в своем вопросе!

Наконец-то я нашел способ добиться того же, используя «EasyXDM» (www.easyxdm.net), чтобы решить эту проблему. Он прекрасно работает на большинстве браузеров, включая IE7 и Firefox старых версий. CORS - это еще одно решение, если вы хотите сделать это, но оно не работает на IE7 ...

Вау! теперь я могу полагаться на междоменную связь между различными приложениями без использования iFrame.

...