我是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
答案 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等支付宝来处理您的付款。