【问题标题】:how to pass params from radio_button_tags to controller如何将参数从 radio_button_tags 传递给控制器
【发布时间】:2012-10-16 12:12:33
【问题描述】:

这是我的表单,其中显示了管理员尚未审核的所有 feedbacks

我在每个 feedback 旁边有 2 个单选按钮,用于选择接受或拒绝值 12

<% form_tag moderate_feedbacks_path, :method => :put do %>
  <table>
    <% @all_feedbacks.each do |feedback| %>
    <tr>
      <td><%= radio_button_tag :review_option, '1', false, :name => feedback.id %></td>
      <td><%= radio_button_tag :review_option, '2', false, :name => feedback.id %></td>
      <td><%= feedback.name %></td>
      <td><%= feedback.email %></td>
      <td><%= feedback.message %></td>
    </tr>
    <% end %>
   </table>
<%= submit_tag 'Apply' %>
<% end -%>

我想要做的是当我单击submit_tag 时,将每个选定feedbackreview_option 字段更新为radio_button_tag12 的值

我现在有你看到的表格,效果很好,但我卡在控制器部分:

def moderate_feedbacks
  Feedback.update_all(["review_option = ?", ????])
  redirect_to admin_feedbacks_path
end

如何将这些单选按钮的参数传递给控制器​​。 谢谢。

附言 html 来源:

<input id="review_option_1" name="3" type="radio" value="1">
<input id="review_option_2" name="3" type="radio" value="2">

名称取自feedback.id

按下 submit_tag 时的日志如下所示;

Processing Admin::FeedbacksController#moderate_feedbacks (for 127.0.0.1 at 2012-10-16 15:36:20) [PUT]
  Parameters: {"commit"=>"Apply", "3"=>"2", "4"=>"1"}

其中 3 是反馈的 id - 2 是单选值,4 是反馈的 id - 1 是单选值

raise.params["feedback.is"].inspect之后

Parameters:

    {"commit"=>"Apply",
     "3"=>"1",
     "4"=>"1",
     "_method"=>"put"}

【问题讨论】:

  • 您的参数哈希看起来如何?您可以粘贴表单提交的服务器日志吗?我认为您必须在参数中传递所有反馈对象的 ID,循环并单独更新每个反馈。这是一项昂贵的操作。我希望有更好的方法来做到这一点。
  • 谢谢,我会粘贴 html 文件的视图源代码,因为这是一个旧的 rails 2.2 应用程序,我使用脚本/服务器而不是乘客运行它。所以很难找到日志。我会粘贴 html 并立即查找日志
  • 好的,添加了日志,我希望这是你要找的部分

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 ruby-on-rails-3.2


【解决方案1】:

好的,答案如下:

feedback.rb

   class Status
     ACCEPTED = 1
     REJECTED = 2
   end

表格中

<% form_tag moderate_feedbacks_path, :method => :put do %>
  <table>
    <% @all_feedbacks.each do |feedback| %>
    <tr>
      <td><%= radio_button_tag :review_option, Feedback::Status::ACCEPTED, false, :name => feedback.id %></td>
      <td><%= radio_button_tag :review_option, Feedback::Status::REJECTED, false, :name => feedback.id %></td>
      <td><%= feedback.name %></td>
      <td><%= feedback.email %></td>
      <td><%= feedback.message %></td>
    </tr>
    <% end %>
   </table>
<%= submit_tag 'Apply' %>
<% end -%>

feedbacks_controller.rb

   def moderate_feedbacks
    params.each do |key, value|
      if key =~ /^r(\d+)/ && !value.blank?
        feedback_id = $1
        Feedback.update_all(["review_option = ?", value.to_i], ["id = ?", feedback_id])
      end
    end
    redirect_to admin_feedbacks_path
  end

【讨论】:

  • 赞成帮助如何将 html 选项传递给表单构建器方法。谢谢!
【解决方案2】:

当我不确定如何在参数中传递数据时,我喜欢在控制器中引发异常。开发异常处理程序输出有关参数内容的非常好的信息。我什至可以为我的异常添加一个 .inspect 并查看详细信息。

def update
  raise "some string"
end

def update
  raise params["feedback.id"].inspect
end

另请注意,radio_button_tag 的第一个参数是名称,因此您不必在选项中传递它。

【讨论】:

  • 按照你的方式做,它返回参数:{"commit"=>"Apply", "3"=>"1","4"=>"1","_method"=> "put"} 看起来参数运行良好.. 无论如何,问题是我如何在控制器中编写代码来获取这些参数并将它们保存在表中
  • 如果我没有在选项中传递名称,我只能从我拥有的所有按钮中选择一个单选按钮,假设我有 10 个反馈和 2 个按钮,20 个单选按钮,我可以只选择一个,因为它们具有相同的名称,这就是我必须传递名称的原因。
  • 你没听懂我在说什么。 review_option 参数将名称指定为 review_option。如果您使用 review_option 调用 radio_button_tag 两次,那么两者都将具有名称 review_option。或者您可以将 feedback.id 作为两个 radio_button_tag 调用的第一个参数传递。
  • 如果 params 变量是一个哈希值,其中 feedback.id 是映射到“1”或“2”的键,那么如何访问哈希值以获取 1 或 2?
  • 我在朋友的帮助下发布了我得到的答案。+1 为您提供帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
相关资源
最近更新 更多