从Ruby on Rails上的另一个表中获取值

时间:2013-11-16 20:14:52

标签: ruby-on-rails ruby arrays

我是Ruby on Rails的新手,我有一点问题: 我有三个班级(升级,credit_card和用户),作为用户,我需要插入我的信用卡购买升级。我所有的课程都正常运作。但问题是我需要获取用户已经插入的所有信用卡号码并将它们作为数组放入Upgrade.form(使用选择框或其他任何内容),因此可以选择其中一个。所以,我想把所有的信用卡信息都带到一个变量中:

    class Upgrade < ActiveRecord::Base
      attr_accessible :account_plan, :credit_card
      has_one :credit_card
      belongs_to :user

      CREDIT_CARD_GETTER = current_user.credit_card
    end

然后,我想在我的选择框中使用它。在表单页面上:

   <div class="field">
    <%= f.label "Choose your Credit Card*" %><br />
    <%= f.select :credit_card, #<%= current_user.credit_card.number %> %>

我该怎么办?这样对吗?对不起,我是红宝石的新手。 谢谢!

更新

为了帮助,我正在更新代码,并将它们全部放在这里。我想显示信用卡号码。

升级指数         我的帐户计划:                           Plano de Compra         

    <% @upgrades.each do |upgrade| %>
    <tr>
    <td><%= upgrade.account_plan %></td>
    <td><%= link_to 'Destroy', upgrade, method: :delete, data: { confirm: 'Are you sure?' } %></td>
    </tr>
    <% end %>
    </table>

    <br />

升级模型

    class Upgrade < ActiveRecord::Base
    attr_accessible :account_plan, :credit_card
    belongs_to :user 
    has_many :credit_cards
    end

用户模型

    class User < ActiveRecord::Base        
    has_many :credit_cards
    has_many :upgrades

信用卡表格

    <div class="field">
    <%= f.label "Flag" %><br />
    <%= f.select :flag,   [['American Express', '1'],['VISA', '2'],['Dinners', '3'],   ['MasterCard', '4']] %>
    </div><br>
    <div class="field">
    <%= f.label "Nome no Cartão" %><br />
    <%= f.text_field :name, :class => "span3"%>
    </div>
    <div class="field">
    <%= f.label "Card Number" %><br />
    <%= f.text_field :number, :class => "span3"%>
    </div>
    <div class="field">
    <%= f.label "Data de Validade" %><br />
    <%= f.text_field :date %>
    </div>
    <div class="field">
    <%= f.label "Sec. Code" %><br />
    <%= f.text_field :seg_cod, :class => "span1"%>
    </div>
    <div class="actions">
    <%= f.submit %>
    </div>
    <% end %>

信用卡模式

    class CreditCard < ActiveRecord::Base
    attr_accessible :date, :flag, :name, :number, :seg_cod
    validates_presence_of :date, :flag, :name, :number, :seg_cod, presence => true
    belongs_to :upgrade
    belongs_to :user
    end

4 个答案:

答案 0 :(得分:0)

我认为将变量传递给视图可以使用像这样的实例变量:

@Credits = current_user.credit_card

然后您可以从视图中访问@Credits。

答案 1 :(得分:0)

更改此

<%= f.select :credit_card, .... %>

到这个

<select_tag name="user[credit_card]">
 <option_tag value="">None</option>
 <option value="1">David</option>
 <option value="2" selected="selected">Sam</option>
 <option value="3">Tobias</option>
</select>

但您的值必须对用户信用卡有效。

答案 2 :(得分:0)

我想user has_many credit_cards。所以我认为你应该

1st:在升级中更改attr_accessible

attr_accessible :account_plan, :credit_card_id

第二。删除或更改此行的逻辑

CREDIT_CARD_GETTER = current_user.credit_card

因为CREDIT_CARD_GETTER是一个常量,你为每个用户改变它?!我无法抓住目标。也许它应该被移除或移动到某个地方

第三。在表格中选择你应该像这样写

<%= f.select(:credit_card_id, current_user.credt_cards.map{ |card| [card.number, card.id] }) %>

第四。 (非常重要!)在控制器中,您必须检查输入的信用卡是否真正属于当前用户

def create
  redirect_to some_path if current_user.credit_card_ids.exclude?(params[:upgrade][:credit_card_id])
  # create upgrade here
end

答案 3 :(得分:0)

如果是用户类has_many credit_cards,您只需调用current_user.credit_cards即可显示包含该用户卡的ActiveRecord Relation对象。

有几点需要注意:首先,您不应该定义CREDIT_CARD_GETTER常量。它可能会抛出错误(如果您尝试动态定义它们,Ruby中的常量是挑剔的),同样重要的是,除非您定义一个调用它的方法,否则它不能在类外部访问。假设您在ApplicationController中定义了current_user,您不需要常量 - 您甚至不需要传入实例变量 - current_user将在任何视图中可用,因此current_user.credit_cards仍然会做你需要的。

其次,从安全角度来看,您不应该存储用户的信用卡数据。这是一个巨大的安全风险。相反,我建议两个更安全的选择。一:使用BCrypt等内容加密信用卡,以便credit_cards表格有两列,一个字符串obscured_card(其值为“ * **** * 1234“)和一个字符串card_hash,这是卡的加密版本。第二,如果您不想自己处理加密或不想担心安全风险,请使用Stripe等支付宝来处理您的付款。