Невозможно отобразить значение ключа в хеше

Я использую Rails3 и в настоящее время использую гем «active_shipping». Когда я повторяю сбор ставок, используя следующие строки кода:

   <%res.rates.sort_by(&:price).each do |rate|%>
   <%service_name = rate.service_name%>
   <%postage_rate = (@bank.get_rate(res.rate_estimates[0].currency,:USD)
   * (rate.price).to_f/100).round(2)%>
   <%=service_name%>, <%=postage_rate%>

Я получаю следующий вывод:

UPS Standard, 40,93
UPS Saver, 73,56
UPS Express, 76,54
UPS Worldwide Express Plus, 129,16

Затем, когда я использую хеш, где service_name — ключ, а postage_rate — значение.

 <%records = {service_name => postage_rate }%>

Затем я создаю radio_buttons:

<%records.each do |key,value|  %> 
<%=f.radio_button :service_name,key%> <%="#{key}, #{value}" %><br/>

введите здесь описание изображения

Весь код выглядит следующим образом:

 <%res.rates.sort_by(&:price).each do |rate|%>
 <%service_name = rate.service_name%>
 <%postage_rate = (@bank.get_rate(res.rate_estimates[0].currency,:USD)
 * (rate.price).to_f/100).round(2)%>

 <%records = {service_name => postage_rate }%>

  <%records.each do |key,value|  %> 
  <%=f.radio_button :service_name,key%> <%="#{key}, #{value}" %><br/>
  
  <%records.length do |i|%>
  <%if i.checked == "true"%> 

  <% if (records.key?(key)) %>
   <%postage_rate = records["#{key}"]%>  

  <%= f.hidden_field :service_name,:value=>key%> 
  <%= f.hidden_field :postage_rate, :value=>postage_rate%>
  <%= f.hidden_field :price_and_rate, :value=>((p.price * order_item.amount)
   + (postage_rate * order_item.amount)).round(2)%>
  <%= f.hidden_field :admin_charge, :value=>(((p.price * order_item.amount)+ 
  (postage_rate * order_item.amount))/100).round(2)%><br/>

  <%end%>
    <%end%>
      <%end%>
         <%end%>

Service_name получает значение, а postage_rate — нет. Я не могу понять, почему. Я получаю следующее исключение:

Mysql2::Error: Столбец 'admin_charge' не может быть нулевым: INSERT INTO curriers (admin_charge, amount, buyer, cart_id, order_item_id, postage_rate, price, price_and_rate, seller, service_name) VALUES (NULL, 1, 'xxxxxx, [email protected], +xxxxxxx, xxxxx ,xxxx, United Kingdom ,xxxxxx', 5, 20, NULL, 45.34, NULL, 'xxxxx,xxxxx ,xxxx, Уокинг, xxxxxx, Великобритания", "Экономия UPS")

Он выдает исключение, потому что значение postage_rate не присвоено. Любая помощь будет оценена. (Извините за мой английский :()


person user1766346    schedule 11.10.2013    source источник


Ответы (1)


Первый шаг: я превратил :service_name и :postage rate в одну строку:

<%service_name = "#{rate.service_name} , 
 # {(@bank.get_rate(res.rate_estimates[0].currency,:USD) 
 * (rate.price).to_f/100).round(2)}"%>

Второй шаг: я отобразил переключатели, используя:

<%res.rates.sort_by(&:price).each do |rate|%>
 <%service_name = "#{rate.service_name} , 
 #{(@bank.get_rate(res.rate_estimates[0].currency,:USD) 
 *(rate.price).to_f/100).round(2)}"%>


 <%postage_rate = (@bank.get_rate(res.rate_estimates[0].currency,:USD) 
 *(rate.price).to_f/100).round(2)%> 

 <%service_names << service_name%>
 <%=f.radio_button :service_name,service_name%> <%= service_name %> <br/>
 <%service_names.length do |i|%>
 <%if i.checked == "true"%> 

 <%= f.hidden_field :service_name,:value=>service_name %>  

        <%end%>
     <%end%>
 <%end%>

введите здесь описание изображения

Третий шаг: я удалил атрибуты :postage_rate, :price_and_rate и :admin_charge из таблицы curriers и вместо этого добавил их в таблицу order_items. Атрибут :service_name я оставил в таблице curriers. Я сделал это, потому что после сохранения атрибута :service_name в таблице curriers в виде строки (например, UPS Standard, 40.93) и использования метода «match» я мог вывести число 40.93 из matchdata в строку, а затем в float:

 def get_postage_rate
 "#{service_name}".match(/(\d+)\.(\d+)/).to_s 
 end

Четвертый шаг: я хотел, чтобы моя кнопка «ДОБАВИТЬ» выполняла две функции: а) сохраняла атрибут :service_name в таблице curriers и б) обновляла атрибуты :postage_rate, :price_and_rate и :admin_charge в таблицу order_items одновременно. Итак, я изменил свой метод создания в файле CurriersController:

 def create  
 @currier = Currier.new(params[:currier])

 if @currier.save

 @order_item = OrderItem.find(@currier.order_item.id)
 value = @currier.get_postage_rate

          @order_item.update_attributes(
              :postage_rate =>value.to_f, 
              :price_and_rate => ((@order_item.price * @order_item.amount)
          +(value.to_f *   @order_item.amount)).round(2),
              :admin_charge => (((@order_item.price * @order_item.amount)+ 
          (value.to_f * @order_item.amount))/100).round(2)
            ) if @currier.service_name != ""

     flash[:notice]= "Currier #{@currier.service_name} was successfully created."
     redirect_to :controller=>'checkout',:action => 'rate_response'

     else  

      @page_title = ''
      render :action=>'new'
         end
      end

введите здесь описание изображения

введите здесь описание изображения

введите здесь описание изображения

person user1766346    schedule 15.10.2013