Отправьте не инициирующие соответствующие заголовки Accept, используя form_remote_tag - PullRequest
0 голосов
/ 19 декабря 2009

Кажется, form_remote_tag генерирует правильный html, но format.html отображается вместо format.js. Два наиболее распространенных ответа на файл format.html, отображаемый вместо format.js, - переименование файла * .rjs в * .js.rjs и проверка загрузки файлов javascript. Оба из них были сделаны. Дайте мне знать, если есть какая-либо другая информация, которую я могу предоставить.

[править] create.js.rjs был добавлен ниже. [/ Править]

Рельсы 2.3.2

просмотр / проекты / show.html.erb

<%= form_remote_tag :url => { :controller => :milestones, :action => :create }
    #:update => 'milestone-list',
    #:url => { :controller => "milestones", :action => :ajax_create},
    #:position => 'bottom'
%>

<%= render :partial => 'milestones/form' %>
<input type="hidden" id="milestone_project_id" name="milestone[project_id]" value="<%=@project.id %>" />

<%= submit_tag 'Add Milestone' %>

milestones_controller.rb

def create
 @milestone = Milestone.new(params[:milestone])

 respond_to do |format|
    if @milestone.save
        flash[:notice] = 'Milestone was successfully created.'
        format.js   {render :layout => false }
        format.html { render :show }#redirect_to(@milestone) }
        format.xml  { render :xml => @milestone, :status => :created, :location => @milestone }
    else
        format.html { render :action => "new" }
        format.xml  { render :xml => @milestone.errors, :status => :unprocessable_entity }
    end
 end
end

заголовки

(доменные имена и ips были изменены. Сервер - монгрел с настройкой apache в качестве прокси)

*  ACCEPT: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
* HOST: 127.0.0.1:8004
* X_FORWARDED_HOST: slate.project.mydevserver.com
* VIA: 1.1 project.mydevserver.com
* USER_AGENT: Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6
* ACCEPT_LANGUAGE: en-us,en;q=0.5
* REFERER: http://slate.project.mydevserver.com/projects/2
* VERSION: HTTP/1.1
* X_FORWARDED_SERVER: project.mydevserver.com
* X_FORWARDED_FOR: 1.2.3.4
* ACCEPT_CHARSET: ISO-8859-1,utf-8;q=0.7,*;q=0.7
* CONNECTION: Keep-Alive
* ACCEPT_ENCODING: gzip,deflate

сгенерированный html

<form action="/milestones" method="post" onsubmit="new Ajax.Request('/milestones', {asynchronous:true, evalScripts:true, parameters:Form.serialize(this)}); return false;">
<div style="margin:0;padding:0"><input name="authenticity_token" type="hidden" value="wTS9QPqFiGvP3RVlvKsA49Z6xtEGH9gmcLP//XC0whc=" /></div>

Title: <input id="milestone_title" name="milestone[title]" size="30" type="text" /><br />
Description: <input id="milestone_description" name="milestone[description]" size="30" type="text" /><br />
Days: <input id="milestone_days" name="milestone[days]" size="30" type="text" /><br />

<input type="hidden" id="milestone_project_id" name="milestone[project_id]" value="2" />

<input name="commit" type="submit" value="Add Milestone" />
</form>

create.js.rjs

page.insert_html :bottom, 'milestone_list', "Hi"

Ответы [ 5 ]

0 голосов
/ 28 декабря 2009

Если вы запускаете rake:routes, заканчивается ли используемый маршрут на (.:format)?

0 голосов
/ 25 декабря 2009

Одна идея состоит в том, что вы можете переписать действие create в вашем контроллере, включив в него тест, чтобы увидеть, является ли запрос XHR (это подробно описано далее в документации), вот упрощенная версия:

def create

  @milestone = Milestone.new(params[:milestone])

  if @milestone.save
    if request.xhr?
      render :update do |page|
        page.insert_html :bottom, 'milestone_list', "Hi"
      end
    else
      respond_to do |format|
        flash[:notice] = "Milestone saved"
        format.html
      end
    end
  else
    respond_to do |format|
      flash[:error] = "There was a problem saving the milestone"
      format.html { render :action => :new }
    end
  end

end

Это может немного подсушить, но вы должны понять.

0 голосов
/ 22 декабря 2009

Вы пытались удалить блок {render :layout => false } из format.js и просто сделать что-то вроде

...
...
format.js
format.html { render :show }#redirect_to(@milestone) }
...

Насколько я понимаю, RJS не работает с макетами, так как не поддается им, хотя я могу ошибаться. Но лично я никогда раньше не использовал опцию: layout в моих ответах js.

Кроме того, в вашем вызове рендеринга отсутствует «что» для рендеринга. Как ...

render :js => "alert('this is javascript')"
render :action => "some_action"
render :xml => ....
0 голосов
/ 24 декабря 2009

Вы можете легко проверить, в порядке ли ваш код, принудительно добавив формат javascript, добавив: format =>: js в хеш URL-адреса. Он явно добавит формат в URL и, таким образом, заставит JavaScript отображаться, но сломает изящную деградацию для браузера с отключенным JavaScript. Если вы хотите сохранить эту функцию - я полагаю, вам следует изучить конфигурацию прокси-сервера (apache), как было сказано выше, - очевидно, она портится с вашими заголовками.

Попытайтесь перехватить запрос, когда он отправляется вашим браузером (с Firebug или LiveHTTPHeaders для Firefox), и сравнить его с тем, который вы видите на стороне сервера. Я полагаю, вы поймете, что в этом ваша проблема.

0 голосов
/ 19 декабря 2009

Есть ли шанс, что у вас отключен JavaScript в браузере, из которого вы тестируете? Это объясняет ваши результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...