【问题标题】:How do I direct the routing of a form to a controller other than the one associated with the model class?如何将表单的路由定向到与模型类关联的控制器以外的控制器?
【发布时间】:2013-08-02 13:54:14
【问题描述】:

有点 RoR 新手。我想在表单上显示模型属性,为用户提供更改其值和“提交”表单的能力。我想将表单路由到不是属性所属类的“基本”控制器的控制器,并让“辅助”控制器更新数据库中的属性。这是表单的代码:

<h1>Edit Number of Current Calls</h1>
<%= form_for(@client) do |f| %>
  <% if @client.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@client.errors.count, "error") %>
        prohibited this client from being saved:</h2>
      <ul>
      <% @client.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
    <% end %>

  <div class="field">
    <%= f.label "Number of Current Calls:" %><br />
    <%= f.text_field :current_call_count %>
  </div>
  <%= button_to 'Update In', { :controller => "client_profiles", :action => "update" }, :method => :put %>
<% end %>

<%= button_to 'Update Out 1', { :controller => "client_profiles", :action => "update" }, :method => :put %>

<%= button_to 'Update Out 2', { :controller => "client_profiles", :action => "update", :client => {:current_call_count => @client.current_call_count} }, :method => :put %>

如果用户“点击”“Update In”按钮,他们的提交将被路由到“clients”控制器,并在 DB 中更新属性。

如果用户单击“更新输出 1”或“更新输出 2”按钮,他们的提交将被路由到“client_profiles”控制器,但属性不会更新。这是“client_profiles”控制器中的相关代码:

    def update
      @client = Client.find(params[:id])
      @client.update_attributes(params[:client])
      redirect_to show_phone_client_profile_path(@client)
    end

如何将“Update In”提交路由到“client_profiles”控制器?

如何捕获用户在“更新输出”按钮中输入的值?

为什么“button_to 代码”的位置会改变 button_to 选项中指向的路由?

我真的想只更新显示多个模型数据的表单中的一个属性。什么是正确的 Rails 方式?

【问题讨论】:

  • 这里发生了很多事情,还有一些事情需要改变。也许您可以用 1 或 2 句话描述您想要的功能?

标签: ruby-on-rails


【解决方案1】:

如果您的视图有多个模型,并且您想要更新特定模型,那么您可以传递该特定模型,或者可能只是 id 并通过参数哈希中的 url 更改属性。但这主要取决于您要达到的目标。也许您应该重写您的确切问题以使其清楚。

【讨论】:

    【解决方案2】:

    好的,所以这不止一件事,首先让我们看一个更简单的问题:

    为什么“button_to 代码”的位置会改变 button_to 选项中指向的路由?

    这很简单:这是因为Update In 按钮位于表单块内。所以它只是将表单提交到form_for 块的第一行中指定的操作。

    这里首先要意识到,表单提交的动作并不依赖于提交按钮,而是依赖于表单本身的属性。如果检查呈现的 HTML,您会看到 &lt;form&gt; 元素有一个名为 action 的属性。当点击表单内的提交按钮时,它会将表单数据提交到该操作中指定的位置。在这种情况下,action 属性派生自 form_for 块的传入对象 (@client),使用 Rails 假定资源路由,因为约定前配置。

    如果希望能够将表单提交到多个位置,我会使用 jQuery 和 AJAX 发布。

    基本上发生的事情是您的Update Out 按钮没有附加到表单,因此它们没有提交表单的数据。您需要以某种方式将两者联系起来,并且由于表单本身实际上只支持一个提交功能,因此您基本上必须在 JavaScript 中完成。

    我不会尝试记录jQuery API,但您基本上在这里要做的是为您的每个按钮注册一个 jQuery POST 回调,以便将表单数据提交到相关页面.

    【讨论】:

    • 感谢您对表单提交约定的深入了解。您引导我找到了一个解决方案,该解决方案将表单提交后的操作逻辑放在它所属的控制器中!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 2018-07-23
    • 1970-01-01
    • 2012-06-27
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多