【问题标题】:How are parameters sent when I use instance variables in form_for in rails当我在rails中的form_for中使用实例变量时如何发送参数
【发布时间】:2019-08-16 14:18:05
【问题描述】:

我对如何通过 rails 中的 form_for 将参数发送到控制器感到有些困惑。我阅读了https://guides.rubyonrails.org/form_helpers.html 中的dealing with model objects 部分并试图理解一点,但对我没有多大帮助。 基本上我有一个像下面这样的表格

<%= form_for @flow, url: '/create_flow' do |f| %>
  <%= f.hidden_field :action_id, value: @selected_action.id %>
  <table class="table table-striped table-bordered table-hover">
    <tr>
      <th>Flow name</th>
      <th>URL</th>
    </tr>
    <% @selected_action.missed_call_flows.each do |flow| %>
      <tr>
        <td><%= flow.name %></td>
        <td><code><%= flow.url %></code></td>
      </tr>
    <% end %>
    <tr class="form-group">
      <td>
        <%= f.text_field :name, class: "form-control", placeholder: "Add a new flow ...", required: true %>
      </td>
      <td>
        <button type="submit" class="btn btn-primary">Generate URL</button>
      <td>
    </tr>
  </table>
<% end %>
<% end %>

并且对应的控制器正在以params[:missed_call_flow][:action_id]的形式访问参数

我的问题是,params[:missed_call_flow] 在表格中的任何地方都没有提及时,它是从哪里发挥作用的。 我从文档中了解到,当实例变量以表格形式给出时,例如这里是@flow,参数可以以params[:flow] 访问。 那么为什么在这段代码中它是 [:missed_call_flow] 而不是 [:flow] ?这也是因为控制器名称是 MissedCallFlowController 的一种访问方式吗?

这是一个示例应用程序,我正在尝试为我的项目了解它,而编写代码的人目前不可用,因此在此处发布以寻求帮助。如果我的问题缺少任何细节,请告诉我。

【问题讨论】:

  • 这是整个表格吗?在我看来,可能会有一个额外的&lt;% end %&gt;
  • 也许您的@flowMissedCallFlow 的一个实例,而不是Flow。简而言之,您可以使用您使用的任何名称来命名您的实例变量,但 form_for 使用您正在传递的对象的 class

标签: ruby-on-rails form-for form-helpers


【解决方案1】:

form_for 助手从模型对象创建表单。如果您以传统方式设置 Rails 应用程序,您将拥有(出现)一个名为 app/models/missed_call_flow.rb 的文件,该文件以定义 class MissedCallFlow 开头。

此文件定义模型。它是 params[:missed_call_flow] 名称的来源,因为 Rails 中的约定是为模型命名此数据结构。

作为编程中的概括,变量名不应影响程序的功能。您已将变量命名为 @flow 的事实会被程序的内部工作方式忽略。程序员可以随意命名变量,这很方便。

我想知道您是否没有看到您期望的模型名称,因为missed_call_flow 表示另外两个表之间的连接表,模型名为missed_callflow。您可能错误地将此 MissedCallFlow 类的实例分配给变量 @flow

【讨论】:

  • 是的,我有一个型号名称为 MissedCallFlow。但是 rails 怎么知道@flow 是 MissedCallFlow 的一个实例而不是任何其他模型?是因为它的位置,即是因为 @flow 还是这个表单是在 MissedCallFlow 控制器中创建的,因此它假设 @flow 属于 MissedCallFlow 模型?
  • 不,这不是假设。你会发现变量@flow 被设置在某个地方,可能在一个控制器文件中。它可能看起来像这样:@flow = MissedCallFlow.new
  • 啊!明白了,是的,它在控制器中设置。非常感谢您的详细回答。
猜你喜欢
  • 1970-01-01
  • 2010-10-31
  • 2015-03-06
  • 1970-01-01
  • 2012-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多