0

有点 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 方式?

4

2 回答 2

0

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

于 2013-08-02T14:26:49.493 回答
0

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

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

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

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

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

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

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

于 2013-08-02T14:33:29.207 回答