RoR: использование form_tag без модели AR - PullRequest
0 голосов
/ 02 марта 2011

Мне нужно представить форму, которая не поддерживается моделью AR. (Я знаю, что этот вопрос задавали десятки раз по-разному, но, несмотря на большое количество прочитанных экспериментов, я все еще не могу понять его правильно.)

Простейший способ описать то, что мне нужно, - это обратный инжиниринг: предположим, мне нужна форма с полем «имя пользователя» и полем «код доступа». Тогда я хочу, чтобы кнопка [submit] позвонила:

ServicesController#update

с хэшем params, установленным (как минимум):

params={"service"=>{"credentials"=>{"username"=>"fred", "accesscode"=>"1234"}}, "commit"=>"update credentials", "action"=>"update", "controller"=>"services", "id"=>"54"}

или, возможно, просто

params={"credentials"=>{"username"=>"fred", "accesscode"=>"1234"}, "commit"=>"update credentials", "action"=>"update", "controller"=>"services", "id"=>"54"}

где '54' - это идентификатор объекта Services, который я хочу обновить. (Мой метод update () извлекает учетные данные из хэша params и делает с ними правильные действия.) (Я не показал маршруты, но не уверен, что это уместно здесь.)

Но я еще не понял, как получить form_tag или form_for, чтобы соответствовать моим ставкам. Предложения?

Обновление В соответствии с рекомендациями апертуры ниже, form_tag кажется правильным. Я получаю ошибку маршрутизации «Не найдено ни одного маршрута» / services / 54 ». Прежде чем я изменю свои текущие маршруты, у меня есть:

resources :premises, :shallow => true do
  resources :services
end

, что дает мне (частично):

edit_service GET    /services/:id/edit(.:format) {:action=>"edit", :controller=>"services"}
     service GET    /services/:id(.:format)      {:action=>"show", :controller=>"services"}
             PUT    /services/:id(.:format)      {:action=>"update", :controller=>"services"}
             DELETE /services/:id(.:format)      {:action=>"destroy", :controller=>"services"}

Ответы [ 2 ]

1 голос
/ 02 марта 2011

Я ставлю галочку на @aperture, но вот окончательная версия, основанная на руководстве диафрагмы после применения всех настроек:

<%= form_tag @service, :url => service_path(@service), :method => :put do %>
  <%= text_field :service, 'credentials[userid]' %>
  <%= text_field :service, 'credentials[accessid]' %>
  <%= submit_tag 'update credentials' %>
<% end %>

Нажатие кнопки [submit] приводит к вызову Service # update () с хэшем params, установленным в:

params={... "_method"=>"put", "service"=>{"credentials"=>{"userid"=>"xxx", "accessid"=>"xxx"}}, "commit"=>"update credentials", "action"=>"update", "controller"=>"metered_services", "id"=>"54"}

Обратите внимание, что я изменил аргументы text_field из версии @ aperture - этот подход оборачивает учетные данные в их собственный хэш учетных данных, поэтому метод обновления Service # можетбыть каноническим:

def update
  @service = Service.find(params[:id])
  @premise = @service.premise
  if (@service.update_attributes(params[:service]))
    redirect_to edit_premise_path(@premise), :notice => 'info was successfully updated'
  else
    redirect_to edit_premise_path(@premise), :error => 'could not update information'
  end
end

... и любая специальная обработка учетных данных находится (как и должно быть) в модели Service.

1 голос
/ 02 марта 2011

routes.rb

match '/services/update/:id', :to => 'services#update', :as => 'update_service'

Тогда ваша форма:

- form_tag @service, :url => update_service_path do
  = text_field :credentials, :userid, 'value' => 'fred'
  = text_field :credentials, :accessid, 'value' => '1234'

тогда в вашем контроллере:

def update
  @service = Service.find_by_id(params[:id])
  @service.update_attribute('userid', params[:credentials][:userid])
  @service.update_attribute('accessid', params[:credentials][:accessid])
end

Я не знаю, что такое объект Services, если это не модель. Поэтому я не знаю, какой метод понадобится для поиска Сервиса по идентификатору, и вызов update_attribute, вероятно, не будет работать, если это не модель, но сложно сказать без дополнительной информации

Это полностью не проверено. Но, надеюсь, близок к работе ...

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