【问题标题】:rails and html, how to retrieve params from a formrails 和 html,如何从表单中检索参数
【发布时间】:2012-05-05 18:48:14
【问题描述】:

我有关注

<%= form_tag lessons_path, :method => 'get', :name => "filter_form" do %>
  <div class="btn-group" data-toggle-name="is_private" data-toggle="buttons-radio" >
  <button value="0" class="btn" data-toggle="button">Public</button>
  <button value="1" class="btn" data-toggle="button">Private</button>
</div>

当用户点击其中任何一个按钮时,表单会提交并转到我的课程#index。我怎样才能得到用户点击的值?我知道 params[:something] 通常来自 url 中的 GET 请求,但是在这种情况下呢?

谢谢

【问题讨论】:

    标签: html ruby-on-rails forms params


    【解决方案1】:

    在 rails 中,params 哈希将包含所有已提交/传递到页面的元素。这包括 GET 参数和 POST 参数。您应该使用check box(或单选按钮)来表示此类数据。如果您的字段存在于数据库中,那么您应该执行以下操作:

    <br><%= f.check_box :is_private %> Private
    

    然后您可以使用params[:is_private] 访问数据

    如果你想使用按钮,那么我建议创建两个 url 来切换复选框的状态。否则,您将不得不依赖 JavaScript 来更改字段。

    如果你想使用按钮,但也使用相同的更新 url,那么你需要按下按钮来切换复选框的状态,有 JQuery 插件可以做到这一点(一个例子是http://widowmaker.kiev.ua/checkbox/) .

    【讨论】:

      【解决方案2】:

      只需给你的按钮name 属性:

      <%= form_tag lessons_path, :method => 'get', :name => "filter_form" do %>
        <div class="btn-group" data-toggle-name="is_private" data-toggle="buttons-radio" >
          <button name="public"  type="submit" value="0" class="btn" data-toggle="button">Public</button>
          <button name="private" type="submit" value="1" class="btn" data-toggle="button">Private</button>
        </div>
      <% end %>
      

      然后像往常一样在控制器中检查params

      if(params[:public])
          # public has pressed
      elsif(params[:private])
          # private was pressed
      else
          # Hmm, someone is trying to cause trouble.
      end
      

      你会注意到我在&lt;button&gt;s 中添加了type="submit",一些浏览器使用type="submit" 作为默认值(根据the standard)和一些使用type="button",所以最好是明确的。

      【讨论】:

      • 那么如果事物通常具有名称属性,可以在参数中检查它们吗?
      • @Crystal:是的,name 属性的存在专门用于以可预测的方式将内容发送到服务器。
      【解决方案3】:

      一个表单只会提交一个动作。

      使用 i18n 定义按钮文本,然后检查控制器操作中提交参数的 i18n 值

      例如 在你的表格中

      <%= submit_tag I18n.t('checkout.button.place_order'), :class => "submit" %>
      

      同样适用于 f.submit 按钮。

      然后在你的控制器中

      if params[:commit] == I18n.t('checkout.button.place_order')
        Do something
      else
        Do something else
      end
      

      在您的 en.yml 或其他任何内容中定义实际文本

      en:
        checkout:
          button:
            place_order: 'Place Order'
      

      显然只是根据您的需要进行调整

      通过使用 i18n,您可以轻松更改 i18n 定义中按钮上的文本,而不会对控制器逻辑产生任何影响,并且仍然可以处理您希望使用的任何国际化/翻译

      使用它,您可以在单个表单上设置任意数量的按钮,然后在控制器操作中添加您需要的任何条件逻辑

      更新 I18n 是国际化的缩写(单词中有 18 个字符 :)),只需在名为 en.yml 的语言环境文件夹中创建一个文件,然后以我上面描述的格式定义您需要的任何内容,您就可以开始了。 使用 t 在任何需要它们的地方引用 I18n 变量。帮手 看看这个 railscast 以获得更详细的解释 http://railscasts.com/episodes/138-i18n

      更新2回应下面mu is too short的评论

      为什么不只添加一个名称属性?然后你可以使用 按钮独立于其内容。请记住,一个罐头 包含在 param 中没有多大意义的嵌入式 HTML

      使用 i18n 会使该注释完全无效,因为根本不检查文本。你可以随心所欲地制作文本,使用 I18n 确实是一个好习惯。请注意,在上面的示例中,您正在检查控制器“checkout.button.place_order”中的常量,而不是定义为“Place Order”的值。

      【讨论】:

      • 感谢您的回答,虽然我不是很想找 i18n。我不知道那实际上是什么,但还是谢谢你=)
      • 我已经相应地更新了我的答案,试一试,你会学到新的东西:)
      • 为什么不添加一个name 属性?然后您可以使用独立于其内容的按钮。请记住,&lt;button&gt; 可以包含嵌入的 HTML,这在 params 中没有多大意义。
      • @mu 太短了——我想你没抓住重点!使用 i18n 使按钮上的文本完全无关紧要!再次阅读我的答案并尝试更好地理解它:)
      • 我知道你在做什么,但如果你不使用name,你会遇到问题。你会用&lt;button type="submit"&gt;&lt;img src="..."&gt;&lt;br&gt;Pancakes&lt;/button&gt; 做什么?您希望将什么发送到服务器?当您单击&lt;button type="submit"&gt;Pancakes&lt;/button&gt; 时,您认为它会向服务器发送什么? &lt;input type="submit" value="Pancakes"&gt; 怎么样?从服务器的角度来看,没有name 的表单控件几乎毫无用处。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-04
      • 1970-01-01
      • 2011-11-01
      相关资源
      最近更新 更多