Ruby on Rails: обновление данных после отправки формы - PullRequest
0 голосов
/ 23 сентября 2011

Это моя форма:

<table>
  <tbody>
  <% form_for :HhActiveCarrier, @carriers, :url => { :action => "update" } do |f| %>
  <% for carrier in @carriers %>
    <tr>
      <%= render :partial => "summary_detail", :locals => {:carrier => carrier, :f => f} %>
    </tr>
  <% end %>
  </tbody>
</table>
  <%= submit_tag "Update" %>
  <% end %>

С моим частичным:

<td class="tn"><%= h(carrier.name.to_s()) -%></td>
<td class="sc"><%= h(carrier.country.to_s()) -%></td>
<td class="sc"><%= select(:carrier, "country", @countries) -%></td>

Это контроллер, в котором я определяю переменные:

class ActiveCarriersController < ApplicationController

    def index
        @carriers = HhActiveCarrier.find(:all)
        for carrier in @carriers
            country = carrier["country"]
            if country.nil?
                carrier["country"] = "none"
            end
        end
        @countries = ["USA", "UK", "Canada"]
    end

    def update
        carriers = HhActiveCarrier.find(:all)
        for carrier in carriers
            carrier.update_attributes(params[:country])
        end
        redirect_to( :action => "index" )
    end

Я хочу, чтобы после нажатия кнопки «Обновить» я хотел, чтобы новая страна, выбранная из раскрывающегося списка, была добавлена ​​в модель HHActiveCarrier. С кодом, который у меня есть сейчас, я получаю эту ошибку:

OCIError: ORA-00904: «ID»: неверный идентификатор: ОБНОВЛЕНИЕ hh_active_carriers SET name = 'AT & T', страна = ноль ГДЕ id = ноль

Как бы я обновил атрибуты this? Я использую рубин на рельсах 2.3.8.

Edit:
Добавлен хеш параметров из журнала разработки:

параметры: {"commit" => «Обновить», «carrier» => {«страна» => «США»}, "action" => "update", "controller" => "active_carriers"}

content_type: #

принимает: [#, #, #]

raw_post: "Носитель% 5Bcountry% 5D = США и носитель% 5Bcountry% 5D = США и носитель% 5Bcountry% 5D = США и носитель% 5Bcountry% 5D = США и фиксация = Update"

query_parameters: {}

request_parameters: {"commit" => "Update", "action" => "update", "carrier" => {"страна" => "США"}, "controller" => "active_carriers"}

Edit3:

Форма:

<table>
  <tbody>
  <% form_for :HhActiveCarrier, :url => { :action => "update" } do |f| %>
  <% for carrier in @carriers %>
    <tr>
      <%= render :partial => "layouts/summary_detail", :locals => {:carrier => carrier, :f => f} %>
    </tr>
  <% end %>
  </tbody>
</table>
<%= submit_tag "Update" %>
<% end %>

Частичная:

<td class="tn"><%= h(carrier.name.to_s()) %></td>
<td class="sc"><%= h(carrier.id.to_s()) %></td>
<td class="sc"><%= h(carrier.country.to_s()) %></td>
<td class="sc"><%= f.collection_select :country, HhActiveCarrier::COUNTRIES, :to_s, :to_s %></td>

Контроллер:

class ActiveCarriersController < ApplicationController

    def index
        @carriers = HhActiveCarrier.find(:all)
        for carrier in @carriers
            country = carrier["country"]
            if country.nil?
                carrier["country"] = "none"
            end
        end

    end


    def update
        #update code
        redirect_to( :action => "index" )
    end
end

1 Ответ

2 голосов
/ 23 сентября 2011

Несколько вещей:

  1. Настройте свою форму так, чтобы она использовала вспомогательный fields_for для каждого из носителей (прокрутите вниз почти на полпути, для фрагмента кода, который помечен как «Или коллекция, которая будет использоваться:»)
  2. Добавьте скрытое поле в вашей частичной структуре, которое указывает идентификатор обновляемого оператора (прямо сейчас ваш хэш params не включает в себя идентификатор записи, подлежащей обновлению, поэтому обновление не выполняется)
  3. Не перебирайте все носители вашего контроллера. Вместо этого вы хотите перебрать хеш.

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

params => {:carrier[1] => {:country => "USA", :id=>"5"}, carrier[2] => {:country => "Brazil", :id=>"17"}}

Затем в вашем контроллере вы должны выполнить цикл params[:carrier].each, чтобы обновить своих операторов.

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