【问题标题】:Passing a param from a view to controller. Then back to a view将参数从视图传递给控制器​​。然后回到视图
【发布时间】:2015-01-07 19:13:41
【问题描述】:

目标是从表单捕获输入,然后在控制器和服务完成后将结果显示在另一个视图上。主要问题是控制器和表单视图之间的交互。视图应该将捕获的输入作为参数传递给控制器​​并继续其愉快的方式。如何正确捕获参数并将其传递给我的控制器?

# controller
class CheckNumberController < ApplicationController
  require_relative '../services/number_check_modulo'
  def get_cert_number(cert)
    @cert_id = cert
  end

  def show_check_number
    checking_policy_number = Get_policy_check_digit.new(@cert_id) # Creates a new instance of the "Get_policy_check_digit" class
                                                                 # From number_check.rb
    @check_number = checking_policy_number.create_check_digit     # Runs the "create_check_digit" method from the "Get_policy_check_digit" class
  end
end

# service 'app/services/number_check_modulo' required in the controller shown above
class Get_policy_check_digit
  def initialize(cert_id)
    #instance variable
    @cert = cert_id
  end

  def create_check_digit
    cert_id_6 = @cert.to_s
    cert_id_6.slice!(0)
    cert_id_6.to_i
    cert_id_6 % 7
  end
end

在我看来,我目前正在使用表单助手 form_tag。用户提交数字后,页面将重定向到输出显示页面。

# Form view
<H1>Enter Cert Number below</H1>

<%= form_tag('show_check_number', method: 'get') do %>
    <%= text_field_tag(:cert) %>
    <%= submit_tag("Submit") %>
<% end %>

此页面仅显示服务“app/services/number_check_modulo”完成的计算结果

# View that shows the result
<h1>Your check number is <%= @check_number %></h1>

我对此很陌生,但我认为我走在正确的轨道上。

【问题讨论】:

  • 也许我遗漏了一些东西,但我没有看到你做任何像params[:cert] 这样的事情来获得:cert 的值;这就是你所缺少的吗?
  • 你的类名和方法名很混乱。无论如何,应该是这样的:checking_policy_number = Get_policy_check_digit.new(params[:cert])get_cert_number(cert)的方法在这里没用

标签: ruby-on-rails ruby forms ruby-on-rails-4 parameter-passing


【解决方案1】:

尝试将方法 show_check_number 更改为此

def show_check_number
  checking_policy_number = Get_policy_check_digit.new(params[:cert]) 
  @check_number = checking_policy_number.create_check_digit    
end

【讨论】:

    【解决方案2】:

    我建议你这个重构:

    # controller
    require 'app/services/number_check_modulo'    
    class CheckNumberController < ApplicationController
    
      def show_check_number
        policy_check_digit = PolicyCheckDigit.new(params[:cert])
        @check_number = policy_check_digit.create_check_digit
      end
    end
    
    # app/services/number_check_modulo
    class PolicyCheckDigit
      def initialize(cert_id)
        @cert = cert_id
      end
    
      def create_check_digit
        cert_id_6 = @cert.to_s
        cert_id_6.slice!(0)
        cert_id_6.to_i
        cert_id_6 % 7
      end
    end
    

    【讨论】:

    • 我尝试重构您显示的方式,但出现错误。 “CheckNumberController#show_check_number 中的 NameError”“未初始化的常量 CheckNumberController::PolicyCheckDigit”。我不明白为什么会发生这种情况。我的拼写是正确的,因为我刚刚复制粘贴了 PolicyCheckDigit。
    • 你必须重启你的服务器,最后把require放到控制器的class块中(类加载时需要文件,系统读取文件时不需要)
    猜你喜欢
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多