Rails remote_function, я могу динамически установить идентификатор на стороне клиента с помощью JavaScript? - PullRequest
1 голос
/ 28 сентября 2010

Я пытаюсь это:

remote_function(:url => {:controller => '/cities', :action => 'show'}, :method => 'get')

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

remote_function(:url => {:controller => '/cities', :action => 'show'}, :method => 'get', :with => "'id=' + $F('query_city_id')")

Но это также дает мне ошибку маршрутизации, я думаю, потому что она хочет, чтобы я определил: id в: url, чтобы сгенерировать действительный URL для «показа»город.Поэтому я пытаюсь жестко закодировать «1» для: id, просто чтобы он заработал, а затем перезаписать: id в: with:

remote_function(:url => {:controller => '/cities', :action => 'show', :id => 1}, :method => 'get', :with => "'id=' + $F('query_city_id')")

Но это также не работает.Кажется, что я действительно хочу, это что-то вроде:

remote_function(:url => {:controller => '/cities', :action => 'show', :id => "$F('query_city_id')"}, :method => 'get')

Но я знаю, что это не работает.Может ли кто-нибудь указать мне правильное направление?Возможно, я пытаюсь использовать неправильную удаленную функцию, или мне может потребоваться сделать что-то более похожее на Rails 3, или мне действительно нужно динамически генерировать базовый вызов ajax на стороне клиента во время выполнения.

1 Ответ

0 голосов
/ 28 сентября 2010

Так что для вашего маршрута, :id присутствует, верно?Вот почему вы должны указать идентификатор при создании маршрута.

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

Однако я раньше не использовал remote_function: D

===== ОБНОВЛЕНИЕ =====

Так что яна самом деле я не знаком с remote_function, поскольку я редко использую встроенный прототип, но jquery.

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

Ниже приведен только пример, который может не подходить для вашего случая:

Определите маршрут:

map.ajax_show_city "/cities/:id", :controller => "cities", :action => "show"

В CitiesController

def show
  @city = City.find(params[:id])
  respond_to do |format|
    format.html #if you don't like, you could delete this line
    format.js # auto call cities/show.js.erb
  end
end

В городах / show.js.erb

jQuery("#the_place_you_want").append("<%= javascript_escape(render(:partial=>@city)) %>");

Для рендеринга использовался city / _city.html.erb для предоставления html-кода города

<%= select_tag "cities", cities_options(with_id_as_the_option_value), :onchange => "show_city(this, '#{url_for(ajax_show_city_path)}')" %>
# This will generate something like:
<select name="cities" id="cities" onchange="show_city(this, '/cities')"> # note the path generated
  <option value="1">City 1</option>
  <option value="2">City 2</option>
</select>

Требуется функция js:

function show_city(select, link) { # sorry for using jQuery
 $.post(link + "/" + retrieve_option_value(select), "", null, "script");
 # $.post(link_to_post, addintional_data, handling_function_after_success, request_type)

 # This would post to /cities/2 with no any params added.
 # Due the the request type being set to script, the returned data would be treated as javascript and executed. So no handling function is needed (that's why null)
}

function retrieve_option_value(select) {
  $(select).children(":selected").val(); # just get the selected option's value
}

Вот и все.

Так что, если js выключен, пользователь все равно может нажать кнопку отправки(используйте js, чтобы скрыть или отсоединить кнопку) и получите правильный результат!Добавление js - это просто добавление более причудливых вещей.Конечно, я согласен, что почти все не отключат поддержку js.Но это доступ к отключениям.

=====

Довольно сложно, что для show path ресурса кажется, что вы должны предоставить id для генерации пути безошибка.

вы можете проверить маршруты:

map.connect "/test", :controller => "cities", :action => "test" # for test only

map.resources :cities
map.other "/cities/show/:id", :controller => "cities", :action => "show", :method => :get

def test
  render :text => url_for(city_path)     # ambiguous routes error
  render :text => url_for(city_path(0)   # gives /cities/0
  render :text => url_for(other_path)    # gives /cities
  render :text => url_for(other_path(0)) # gives /cities/0
end

Обходной путь для вашего пути - сгенерировать /cities/0 и во время выполнения использовать js для замены 0 на выбранный вами идентификатор.

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