Несколько действий во вложенных формах — атрибуты, переданные в link_to

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

Итак, у меня есть простая модель User, которая has_one :place принимается для вложенных атрибутов:

class User < ActiveRecord::Base
   ...

   has_one :place, :dependent => :destroy
   accepts_nested_attributes_for :place
   attr_accessible :place_attributes
   ...
end

Модель Place содержит такие атрибуты, как :street_number, :street, :postal_code, :city, :country.

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

# place_controller.rb
class PlaceController < ApplicationController
   ...
   def validate
      # code for validation
   end
 end

Кстати, я определил маршруты для этого места следующим образом:

# route.rb
resources :users do
  resource :place do
    match 'validate', :to => 'place#validate'
  end
end

Затем в представлении я настроил форму:

<%= form_for(:user, :url => edit_user_path(@user), :html => {:method => :put, :multipart => true}) do |f| %>
 <%= f.text_field :name %>
 # other fields for users
 ...
 <%= f.fields_for :place do |builder| %>
   <%= render 'places/form', :f => builder %>
 <% end %>

 <%= f.submit "Update" %>

И частичный places/form управляет полями для вложенных атрибутов place:

<%= f.text_field :street_number %>
<%= f.text_field :street %> 
...

Вот в чем дело: я хотел бы иметь отправку или ссылку для вызова действия validate с атрибутами модели места. Я пробовал что-то вроде:

<%= link_to 'Validate', validate_user_place_path(@user, :format => :js, :params_to_validate => f.object), :remote => true %>

Даже если он правильно вызывает контроллер, я не получаю проверки атрибутов в контроллере.

Что мне делать?

Спасибо за вашу помощь!


person microcosme    schedule 20.09.2012    source источник


Ответы (1)


Себе:

Я, наконец, сделал это, добавив две простые кнопки в форме с именем к одной из кнопок, чтобы определить предпринятое действие. Я просто следовал идее следующего railscast: Railscast 38 .

Итак, в представлении:

<%= f.submit 'Validate', :name => 'validate_place' %>
<%= f.submit 'Update' %>

И в контроллере User я проверяю кнопку в действии update:

def update

 if params[:validate_place] 
    #validation of place is performed

 else
    #user is updated
 end
end

Единственное, чего не хватает, это то, что это не база ajax. Как жаль!

Ваше здоровье...

Я бедный одинокий ковбой...

person microcosme    schedule 03.10.2012