2009-04-07 4 views
6

У моего приложения есть окно выбора для пользователей, чтобы выбрать «место». Это поле выбора, как и следовало ожидать, в форме. У меня также есть действие где-то на странице, которая создает новое место через AJAX. После создания нового места я хотел бы обновить поле выбора места, чтобы отразить это.Можно ли разместить элемент рельсов в частичном?

Моим решением было поместить поле выбора в частичное и отобразить частичное из действия create в контроллере.

<div id="venue_select" style="clear: both;"> 
    <%= render :partial => 'venue/venue_select_box' %> 
</div> 

Частичные выглядит следующим образом:

<%= f.collection_select :venue_id, @user_venues, :id, :name, :prompt => 'Select a venue' %> 

где F является формой ссылка:

<% form_for :shows do |f| %> 

Проблема заключается в том, что е не определено в частичной, так что я получаю сообщение об ошибке , Одним из решений было бы включить всю форму, но я чувствую, что это не обязательно, потому что я не обновляю всю форму. Любые идеи о том, как это сделать?

ответ

0

Это все большие варианты, но я думаю, что я нашел самый простой. В принципе, я просто жестко закодирован имени в collection_select, так что я не нужен «F» переменный:

<%= collection_select 'shows[venue_id]', :venue_id, @user_venues, :id, :name, { :prompt => 'Select one of your previous venues' } %> 

Тогда мой VenueController выглядит следующим образом:

class VenueController < ApplicationController 
    layout 'main' 
    before_filter :login_required, :get_user 

    def create 
    begin 
     venue = @user.venues.create(params[:venue]) 
     @user_venues = @user.venues 
     render :partial => 'venue_select_box', :success => true, :status => :ok 
    rescue ActiveRecord::RecordInvalid => invalid 
     flash[:errors] = invalid.record.errors 
     render :text => '', :success => false, :status => :unprocessable_entity 
    end 
    end 

end 

Если этот метод является плохой практикой для любая причина, пожалуйста, дайте мне знать, и я с радостью буду благодарен вам за ответ.

8

Вы можете передать переменную парциальное следующим образом:

<%= render :partial => 'venue/venue_select_box', :locals => { :f => f } %> 

Для вещи, как это всегда хорошо, чтобы посмотреть на documentation.

EDIT: Чтобы использовать частичный запрос AJAX, вам необходимо «воссоздать» форму в вашем шаблоне .rjs. Поэтому в вашем контроллере вам нужно будет снова найти объект.

def venue_select 
    @venue = Venue.find(params[:id]) 
    respond_to do |format| 
     format.html 
     format.js 
    end 
end 

Тогда в вашем месте/venue_select.rjs файл:

form_for @venue do |f| 
    page[:element].replace_html :partial => 'venue/venue_select_box', :locals => { :f => f } 
end 

Где :element это идентификатор выбора меню, которое необходимо заменить. В основном вы просто воссоздаете form_for, а затем используете это, чтобы обновить поле выбора.

+0

Это работает с точки зрения, но мне нужно будет визуализировать и с контроллера. В поле выбора извлекаются данные, которые могут быть обновлены через AJAX, и поэтому этот запрос на обновление подскажет контроллеру, чтобы снова отобразить частицу ... а затем «f» снова не определено – Tony

+0

А, извините, я не видел необходимости AJAX в вашем вопросе. В следующий раз мне следовало бы прочитать немного более внимательно ... Я просто обновил свой ответ тем, что может вам помочь. – vrish88

+0

Как бы вы это сделали с Rails 3/4 и UJS? Проблема, с которой я сталкиваюсь, заключается в том, что вы не можете получить какую-либо часть формы, не помещая form_for внутри тега печати, который затем печатает всю форму. –

1

Возможно, было бы проще добавить место в selectbox с Javascript, как крючок onComplete на ваш AJAX add.

1

Я согласен с Сарой Мей на этом, если что-нибудь у вас вызывает вызов AJAX, возвратите JSON-представление места, которое было добавлено, а затем создайте новую опцию и добавьте ее в элемент select.

Некоторые общие JS-код для добавления выберите опцию:

var newOption = new Option("Text", "Value"); 
selectElement.options[selectElement.options.length] = newOption; 
0

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

Чтобы избежать этого, вы можете отправить в пределах ajax-запроса содержимое f.object_name. В вашем случае это будет «показов», и потому что метод: place_id, сгенерированное имя будет «показано [место_имя]».

Смежные вопросы