如何根据布尔值配置隐藏指定Stripe付费按钮?
解决方案:根据教练设置动态显示Stripe套餐按钮
我来帮你搞定这个需求,核心思路就是把教练设置里的布尔开关和对应的Stripe套餐关联起来,只渲染那些被教练启用的套餐按钮。下面分步骤实现:
步骤1:建立套餐ID与教练属性的映射
首先,我们需要把你的@usd_plans里的套餐ID,和数据库中教练的布尔字段对应起来,避免硬编码出错。在你的controller里添加这段代码:
# 放在@usd_plans定义的下方 @plan_to_coaching_field = { 'basic_usd': :basic_coaching, 'professional_usd': :professional_coaching, 'premium_usd': :premium_coaching, 'platinum_usd': :platinum_coaching }
步骤2:过滤出教练启用的套餐
接着,我们从@usd_plans中筛选出教练已经启用的套餐,这样view里就不用再做判断了:
@enabled_usd_plans = @usd_plans.select do |plan_id, description| # 通过send方法动态获取教练对应的属性值 @user.send(@plan_to_coaching_field[plan_id]) end
步骤3:修改View渲染启用的套餐
最后,把view里的循环对象从@usd_plans改成@enabled_usd_plans,这样只有启用的套餐才会渲染Stripe按钮:
- @enabled_usd_plans.each do |plan_id, description| td = form_tag(subscriptions_path) do = hidden_field_tag 'plan', plan_id = hidden_field_tag 'coach_id', @user.id = hidden_field_tag 'user_id', current_user.id = hidden_field_tag 'description', description - if current_user.coupon_code = hidden_field_tag 'coupon_code', current_user.coupon_code script.stripe-button( src='https://checkout.stripe.com/checkout.js' data-key=Rails.configuration.stripe[:publishable_key] data-name="#{@user.name}" data-description=description data-image="#{@user.avatar.url}" data-locale='auto' data-panel-label='Subscribe now' data-label='Buy' data-allow-remember-me='false' data-email=current_user.email )
备选方案:直接在View中判断(适合简单场景)
如果不想修改controller,也可以直接在view里添加判断逻辑,把映射关系写在循环里:
- @usd_plans.each do |plan_id, description| # 建立临时映射 - field_map = { 'basic_usd': :basic_coaching, 'professional_usd': :professional_coaching, 'premium_usd': :premium_coaching, 'platinum_usd': :platinum_coaching } # 判断当前套餐是否被教练启用 - if @user.send(field_map[plan_id]) td = form_tag(subscriptions_path) do # 原有的form内容保持不变 ...
不过更推荐第一种方案,把数据处理逻辑放在controller,让view专注于渲染,代码结构更清晰。
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

