【问题标题】:Rails Posting to another ControllerRails 发布到另一个控制器
【发布时间】:2011-08-05 00:11:05
【问题描述】:

我有一个名为orders 的控制器。在该控制器中有一个newcreate 操作。用户可以从订单/新页面创建订单,但我也希望他们能够从主页创建订单。到目前为止,这是我尝试做的事情

<%= form_tag :controller => "orders", :action => "create" do %>
  <%= text_field_tag :first_name, 'Test1' %>
  <%= text_field_tag :last_name, 'Test2' %>
  <%= submit_tag %>
<% end %>

但是,它拒绝了该信息并将我带回orders/new 页面。它拒绝它的原因是因为我在这两个字段上有一个validates_presence_of,并且由于某种原因信息没有被传递。

有什么建议吗? 提前致谢

【问题讨论】:

  • 你有 3 个不同的答案,但它们都等同于同一件事。让你选择:)

标签: ruby-on-rails ruby ruby-on-rails-3 forms


【解决方案1】:

@Kreek,很好地解释了这个问题。比手动处理这些参数更好的方法是像这样更改您的表单:

<%= form_for Order.new do |f| %>
  <%= f.text_field :first_name %>
  <%= f.text_fiels :last_name %>
  <%= f.submit %>
<% end %>

【讨论】:

  • 很好,但我会在呈现此表单的操作中设置对象并从那里引用它。这比“你必须这样做”更像是一个公认的标准。
  • 这很好,但问题是关于使用 form_tag 也可以使用。订单创建操作将处理 Order.new。只需将 text_fields 嵌套在订单哈希中
【解决方案2】:

您正在发布到该控制器,但表单是通用的(未分配给与 form_for 类似的模型),因此参数仅作为 params[:first_name] params[:last_name] 进入。在这种情况下,您必须手动将这些值映射到 Order 模型的新实例。

【讨论】:

    【解决方案3】:

    与你的看法相反。您的 first_name 和 last_name 参数实际上被传递到 create 操作中。只是它们以一种你意想不到的方式通过 检查您的日志文件中的创建操作,您将在那里看到它们。

    您的问题在于字段没有嵌套在订单参数中,这是您的创建操作所期望的。

    我的意思是,您的 create 操作将需要 params[:order],而实际上您在 create 操作中需要 params[:first_name] 和 params[:second_name],这不是您想要做的。

    解决方案?

    像这样将字段嵌套在订单哈希中

      <%= text_field_tag :order[:first_name], 'Test1' %>
      <%= text_field_tag :order[:last_name], 'Test2' %>
    

    工作完成:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-22
      • 2017-11-20
      • 2013-04-18
      • 2010-09-30
      • 2019-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多