【问题标题】:Rails form_for sending params to controller action and not modelRails form_for 将参数发送到控制器动作而不是模型
【发布时间】:2016-04-09 12:17:47
【问题描述】:

在控制器review_queue 中,我有一个将结果发布到目标 URL 的自定义操作,我想为此操作构建一个表单。我不会将任何字段保存到数据库中,我只是将它们在参数中传递给post_review 操作。

def post_review
  RestClient::Request.execute(:method => :post,
                              :url => Rails.application.secrets['target_url'],
                              :content_type => :json,
                              :payload => @result_params.merge!(params[:reasons]).to_json,
                              :headers => HEADERS)
end

在视图中,我有一个要填写的表格,提交时应该发送提交表格时的原因,我在表格中设置review_queue_idstatus,因为它们是静态的,但原因应该来自textarea

<%= form_for(:review_queue, url: { action: 'post_review', :review_queue_id => @review_queue.id, :status => 'accepted'} ) do |f| %>
  <div class='form-group'>
    <label for='comment'>Please give a reason? (required)</label>
    <%= f.text_area(:reasons, placeholder: 'Your commentns ...', rows: 9, class: 'form-control') %>
  </div>
  <div class='modal-footer'>
    <%= f.submit 'Approve', class: 'btn btn-success btn-decission btn-modal-left-side'  %>
    <button type='button' class='btn btn-default' data-dismiss='modal'>Close</button>
  </div>
<% end %>

错误信息:

NoMethodError - undefined method `reasons' for #<ReviewQueueApplication:0x007fa7ff7832d8>:

似乎 rails 在这里假设 MVC 架构,并假设我想将原因传递给 review_queue 模型。没有原因列,因此它删除了无方法错误。有没有办法指定表单是“临时的”并且只能到达控制器?

这似乎应该是一件简单的事情,但这里发生了一些轨道魔法。

【问题讨论】:

    标签: ruby-on-rails ruby model-view-controller


    【解决方案1】:

    NoMethodError - 未定义的方法“原因” ReviewQueueApplication:0x007fa7ff7832d8

    form_for 假设您正在为 模型对象 创建一个表单,并希望 字段存在 在那个特定的模型表在正常情况下)。

    你应该选择form_tag

    <%= form_tag post_review_path, method: :get, :review_queue_id => @review_queue.id, :status => 'accepted'} ) do |f| %>
      <div class='form-group'>
        <label for='comment'>Please give a reason? (required)</label>
        <%= text_area_tag(:reasons, placeholder: 'Your commentns ...', rows: 9, class: 'form-control') %>
      </div>
      <div class='modal-footer'>
        <%= submit_tag 'Approve', class: 'btn btn-success btn-decission btn-modal-left-side'  %>
        <button type='button' class='btn btn-default' data-dismiss='modal'>Close</button>
      </div>
    <% end %>
    

    在控制器中访问它就像params[:reasons]。另外,如果您注意到,我已将 method: :get 添加到 form_tag,因为您不想将信息保存到 DB

    【讨论】:

    • 感谢@pavan 的解释。我看到文本区域现在乱七八糟了,但没关系弄清楚这一点。至少我现在看到了控制器中的参数 :)
    • 表单标签行不会是这样的吗? &lt;%= form_tag(post_review_review_queue_applications_path(:review_queue_id =&gt; @review_queue.id, :status =&gt; 'accepted'), method: :get) do |f| %&gt;
    • @TheLegend 您应该将表单附加到您在路线中定义的路线。由于您的路线是post_review,因此它将是post_review_path
    • 好东西!谢谢你这个星期六摇我的袜子!你才是真正的MVP
    【解决方案2】:

    rails 助手 form_for 用于 rails 资源的表单。您想使用 form_tag 助手。搜索 form_for 和 form_tag here 了解有关这两种方法的更多信息。

    【讨论】:

    • 非常感谢你!我以前从未使用过 form_tag。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 2014-10-08
    • 2021-08-27
    • 2015-10-16
    • 2023-03-19
    相关资源
    最近更新 更多