2014-10-03 2 views
0

Использование Rails 4 и Ruby 1.9.3. Styling обрабатывается внутренне разработанным камнем на основе бутстрапа 3.Как сделать элементы на форме рельсов сортируемыми

Я искал ответы на это и нашел несколько разных примеров, которые показывают, как сделать это с помощью основного списка в представлении. Я считаю, что railscast - один из таких примеров.

http://railscasts.com/episodes/147-sortable-lists

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

Моя модель обслуживания относится к модели мест через служебные места. Поле service_places.position хранит порядок остановок.

Моя вложенная форма (_form.html.erb) услуг приведен ниже:

<!-- Adds the Service_Places (stops) associations via partial (sort applied in model) --> 
<div> 
    <div class="links" id="sortable"> 
    <%= link_to_add_association 'Add Stop', f, :service_places, :class => "btn btn-default", :data => {"association-insertion-method" => "after" } %> 
    </div> 
    <%= f.fields_for :service_places do |service_places| %> 
    <%= render 'service_place_fields', :f => service_places %> 
    <% end %> 
</div> 

Мой service_place парциальное показано ниже:

<!-- This will hold the partial form for service places --> 
<div class="nested-fields"> 
    <%= f.label :service_place, "Stops", :class=>"col-sm-2 control-label" %> 
    <div class="col-sm-1"> 
    <%= f.text_field :position, :class=> "form-control", :placeholder => "Position" %> 
    </div> 
    <div class="col-sm-3"> 
    <%= f.collection_select :place_id, Place.where('active = true').order(:place_name), :id, :place_name, :prompt => "Select Place" %> 
    </div> 
    <div> 
    <%= link_to_remove_association "Remove Stop", f, :class => "btn btn-default" %> 
    </div> 
</div> 

Я начал смотреть на то, чтобы назначить идентификатор для каждого из тегов DIV в части service_place, но не может заставить его работать.

Вопросы, которые я хотел бы знать, являются:

1) Можно ли разрешить пользователю изменять порядок элементов в формах? и сохранить новый порядок на сервере?

2) Если возможно, кто-то может дать мне подсказку о том, как это сделать.

Заранее благодарим за то, что нашли время, чтобы посмотреть этот пост.

+0

попробовать ' <% = f.fields_for: service_places, f.object.service_places.order ('позиция asc') do | service_places | %> ' – juanpastas

+0

Спасибо за комментарий Хуан. Это не то, что мне нужно. Я ищу, чтобы пользователь мог переупорядочить данные в форме и обновить соответствующее поле позиции на основе этого (возможно, при его представлении). Ответ будет включать javascript в некотором формате. Railscast - хороший пример того, чего я пытаюсь достичь. –

+0

Теперь я понимаю, пожалуйста, отредактируйте свой вопрос, чтобы сделать это яснее. – juanpastas

ответ

0

Мой коллега показал мне способ достичь этого, используя драгоценный камень «действует как список».
Его блог можно найти здесь:

http://nicholshayes.co.uk/blog/?p=344

Чтобы получить эту работу я сделал изменения, как показано ниже.

1) В моей модели сервиса я добавил эти три метода:

# Used in the positioning of service places using the acts_as_list gem 
    def method_missing(symbol, *args, &block) 
    if acts_as_list_method?(symbol) 
     pass_method_to_service_service_place(symbol, args.first) 
    else 
     super 
    end 
    end 

    # Used in the positioning of service places using the acts_as_list gem 
    def pass_method_to_service_service_place(symbol, service_place) 
    raise "A Service_Place is needed for re-ordering places" unless service_place.kind_of? ServicePlace 
    service_place.send(symbol) if service_place 
    end 

    # Used in the positioning of service places using the acts_as_list gem 
    def acts_as_list_method?(symbol) 
    ActiveRecord::Acts::List::InstanceMethods.instance_methods.include?(symbol.to_sym) 
    end 

2) Добавлен маршрут

resources :services, :concerns => :paginatable, only: [:create, :destroy, :edit, :index, :new, :show, :update] do 

    # Required for the re-ordering of the routes 
    resources :service_places do 
     member do 
     get :move_up 
     get :move_down 
     end 
    end 

    end 

3) Внести поправки в сервисном show.html

<% @service.service_places.reorder("service_places.position asc").each do |serviceplace| %> 

    <dd> 

    <% if user_signed_in? %> 
     <% if @service.first?(serviceplace) %> 
     <%= link_to('', move_up_service_service_place_path(serviceplace, service_id: @service), class: "btn btn-default btn-xs glyphicon glyphicon-arrow-up invisible") %> 
     <% else %> 
     <%= link_to('', move_up_service_service_place_path(serviceplace, service_id: @service), class: "btn btn-default btn-xs glyphicon glyphicon-arrow-up") %> 
     <% end %> 

     <% if @service.last?(serviceplace) %> 
     <%= link_to('', move_down_service_service_place_path(serviceplace, service_id: @service), class: "btn btn-default btn-xs glyphicon glyphicon-arrow-down invisible") %> 
     <% else %> 
     <%= link_to('', move_down_service_service_place_path(serviceplace, service_id: @service), class: "btn btn-default btn-xs glyphicon glyphicon-arrow-down") %> 
     <% end %> 
    <% end %> 

    <!-- Unfortunately this is not very efficient way of showing the place because it calls the db for each item. --> 
    <%= Place.find(serviceplace.place_id).place_name %> 

    </dd> 

<% end %> 
Смежные вопросы