【问题标题】:How do I use if else function through radio button in html.erb view?如何通过 html.erb 视图中的单选按钮使用 if else 功能?
【发布时间】:2014-09-18 15:16:38
【问题描述】:

我有这样的视图 (/app/views/projects/new.html.erb) 我应该如何使用 if else 函数来做到这一点?

<p>
<%= f.label :payment_type, "payment_type" %>
<%= f.radio_button :payment_type, 1, checked: true %>(1)
<%= f.radio_button :payment_type, 2 %>(2)
</p>

if payment_type == 1

  show these things

else(or payment_type == 2)

  show these things

end

我的控制器保存这个视图(/app/controllers/projects_controller.rb):

def new
  @project = Project.new
end

def create
  @project = Project.new(params.permit![:project])
end

我如何使用它的属性

【问题讨论】:

  • 您需要使用 javascript 来执行此操作,方法是获取 payment_type 值并将其传递给 JS 函数并将 if 和 else 情况放在那里。你能在你的问题中解释一下 if 条件中这些东西的显示应该是什么吗?
  • 用您的表单填写您的html.erb,因为您没有提供整个表单标签,不知道f 是什么。 payment_type@project 的属性吗?

标签: ruby-on-rails ruby html radio-button erb


【解决方案1】:

Javascript

您需要使用 Javascript 来提供一些前端交互性。

为了给你一些细节——当你运行一个 Rails 应用程序时,系统的 *rails 部分将在后端运行——这意味着每次你渲染一个“视图”时,你的控制器都会拉取数据来自您的模型,允许 Rails 为您创建纯 HTML 输出。

您遇到的问题是,当您呈现此输出时,您无法再次为该调用调用 Rails 功能(查看stateless 技术的工作原理——An example of a stateless protocol is HTTP, meaning that each request message can be understood in isolation.),这意味着您需要一些方法来管理前端- 界面的结束区域。

这是通过Javascript完成的:

[Javascript] 最常用作网络浏览器的一部分,其 实现允许客户端脚本与用户交互, 控制浏览器,异步通信,改变 显示的文档内容

--

这就是你的处理方式:

JSFiddle

  1. 将无线电输入“绑定”到“更改”事件
  2. 当 change 事件触发时,直接在你的 JS 中执行业务逻辑
  3. 将更改附加到视图 (DOM)

导轨

以下是您需要做的具体操作:

#app/assets/javascripts/application.js
$(document).on("change", 'input[type="radio"]', function(){
    if($(this).val = "1") { 
        // something here
    }else{
        // something else here
    };
});

#app/views/controller/your_view.html.erb
<%= f.label :payment_type, "payment_type" %>
<%= f.radio_button :payment_type, 1, checked: true %>(1)
<%= f.radio_button :payment_type, 2 %>(2)

--

Ajax

除此之外 - 如果您想将基于 Rails 的业务逻辑返回到您的视图中,您将需要使用ajax。除了说这实际上会向您的浏览器发送“伪请求”之外,我不会对此进行太多详细说明。

以下是您的设置方式:

#config/routes.rb
resources :payments do
   get :type, on: :collection #-> domain.com/payments/type
end

此自定义方法将允许您执行所需的业务逻辑:

#app/controllers/payments_controller.rb
class PaymentsController < ApplicationController
   def type
      type = params[:type]
      if type == "1"
         ...
      else
         ...
      end
   end
end

这将使您能够创建对此方法的 ajax 调用:

#app/assets/javascripts/application.js
$(document).on("change", 'input[type="radio"]', function(){
        $.ajax({
           url: "payments/type",
           data: { type: $(this).val() },
           success: function(data) {
              alert("Success");
           }
        });
});

【讨论】:

    【解决方案2】:
    <% if payment_type == 1  %>
        these
    <% else %>
       those
    <% end %>
    

    【讨论】:

    • 它显示undefined local variable or method 'payment_type'
    • 你必须通过你的控制器提供变量;如果它是您模型的属性,看起来,您可以尝试@mymodel.payment_type
    • 我应该怎么做?你能给我举个例子吗?
    • 请编辑您的问题,首先为该视图添加控制器代码:哪个控制器正在为该视图提供服务?
    • 如果@project 有一个成员'payment_type',那么你可以做&lt;% if @project.payment_type ==1 %&gt;,其余的保持不变
    猜你喜欢
    • 2020-03-15
    • 2013-07-21
    • 2018-12-27
    • 1970-01-01
    • 2015-09-13
    • 2023-03-12
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多