0

私は Rails3 を使用しており、現在 'active_shipping' gem を使用しています。次のコード行を使用してレートのコレクションを反復すると:

   <%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::エラー: 列 'admin_charge' を null にすることはできません: INSERT INTO curriers( admin_charge, amount, buyer, cart_id, order_item_id, postage_rate, price, ) VALUES ( NULLprice_and_rate , 1 seller, 'xxxxxx, xxxxxx@xxxxx.com, +xxxxxxx, xxxxx ,xxxx, United Kingdom ,xxxxxx', 5, 20, NULL , 45.34, NULL , 'xxxxx,xxxxx,xxxx, ウォーキング, xxxxxx, イギリス', 'UPS Saver' )service_name

値が postage_rate に割り当てられていないため、例外がスローされます。どんな助けでも大歓迎です.(私の英語で申し訳ありません:( )

4

1 に答える 1

0

最初のステップ: :service_name と :postage rate を 1 つの文字列に変換しました。

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

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%>

ここに画像の説明を入力

3 番目のステップ: :postage_rate、:price_and_rate、および :admin_charge 属性を curriers テーブルから削除し、代わりに order_items テーブルに追加しました。curriers テーブルに残した :service_name 属性。これを行ったのは、curriers テーブルに :service_name 属性を文字列 (UPS 標準の 40.93 など) として保存し、「match」メソッドを使用して、番号 40.93 を matchdata から文字列に取り出し、次に浮動小数点数にすることができたからです。

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

4 番目のステップ:「ADD」ボタンで次の 2 つのことを行うようにしました。a) :service_name 属性を curriers テーブルに保存し、b) :postage_rate、:price_and_rate、および :admin_charge 属性を order_items テーブルに同時に更新します。そこで、CurriersController ファイルの create メソッドを次のように変更しました。

 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

ここに画像の説明を入力

ここに画像の説明を入力

ここに画像の説明を入力

于 2013-10-15T19:52:20.077 に答える