【问题标题】:Links and parameters链接和参数
【发布时间】:2014-01-31 04:00:49
【问题描述】:

我正在尝试使一系列链接正常工作。有些应该是可切换的,有些则不是。

基本上在重新加载页面时,我的 params 哈希已经有两个不应该有的键,我看不到它们被添加到哪里。

我的链接:

<ul class="all filter__group">
  <li><%= link_to "View all", coasters_path(page: 1), remote: true %></li>
</ul>

<ul class="types filter__group">
  <%= content_tag(:li, class: ("active" if params[:type] == "steel")) do %>
    <%= link_to "Steel", coasters_path(type_parameters("steel", page: 1)), remote: true %>
  <% end %>
  <%= content_tag(:li, class: ("active" if params[:type] == "wood")) do %>
    <%= link_to "Wood", coasters_path(type_parameters("wood", page: 1)), remote: true %>
  <% end %>
  <%= content_tag(:li, class: ("active" if params[:type] == "powered")) do %>
    <%= link_to "Powered", coasters_path(type_parameters("powered", page: 1)), remote: true %>
  <% end %>
</ul>

<ul class="letters filter__group">
  <%= content_tag(:li, class: ("active" if params[:letters] == "#")) do %>
    <%= link_to "#", coasters_path(letter_parameters("#", page: 1)), remote: true %>
  <% end %>
  <%= content_tag(:li, class: ("active" if params[:letters] == "a-e")) do %>
    <%= link_to "A-E", coasters_path(letter_parameters("a-e", page: 1)), remote: true %>
  <% end %>
  <%= content_tag(:li, class: ("active" if params[:letters] == "f-j")) do %>
    <%= link_to "F-J", coasters_path(letter_parameters("f-j", page: 1)), remote: true %>
  <% end %>
  <%= content_tag(:li, class: ("active" if params[:letters] == "k-o")) do %>
    <%= link_to "K-O", coasters_path(letter_parameters("k-o", page: 1)), remote: true %>
  <% end %>
  <%= content_tag(:li, class: ("active" if params[:letters] == "p-t")) do %>
    <%= link_to "P-T", coasters_path(letter_parameters("p-t", page: 1)), remote: true %>
  <% end %>
  <%= content_tag(:li, class: ("active" if params[:letters] == "u-z")) do %>
    <%= link_to "U-Z", coasters_path(letter_parameters("u-z", page: 1)), remote: true %>
  <% end %>
</ul>
<%= debug params %>

辅助方法:

  # Add the type parameter to URL if not already there and remove if they are
  def type_parameters(type, options = {})
    parameters = {}
    if params[:type] == type
      # Get exisiting params
      parameters = params
      # Remove type
      parameters.delete(:type)
      # Merge any parameters passed in via options
      parameters.merge!(options)
    else
      # Get exisiting params
      parameters = params
      #Add type to new parameters variable
      parameters.merge!(type: type)
      # Merge any parameters passed in via options
      parameters.merge!(options)
    end
    parameters
  end

  # Add the letters parameter to URL if not already there and remove if they are
  def letter_parameters(letters, options = {})
    parameters = {}
    if params[:letters] == letters
      # Get exisiting params
      parameters = params
      # Remove letters
      parameters.delete(:letters)
      # Merge any parameters passed in via options
      parameters.merge!(options)
    else
      # Get exisiting params
      parameters = params
      #Add letters to new parameters variable
      parameters.merge!(letters: letters)
      # Merge any parameters passed in via options
      parameters.merge!(options)
    end
    parameters
  end

在页面重新加载时,这是当前的参数哈希:

--- !ruby/hash:ActiveSupport::HashWithIndifferentAccess
action: index
controller: coasters
type: powered
page: 1
letters: u-z

关于我哪里出错了有什么想法吗?

【问题讨论】:

  • 你能告诉我们控制器的动作吗?
  • 您确定没有重新加载包含letters=u-z 的网址吗?
  • 阳性。我刚刚尝试从新选项卡访问它。从头开始重新输入 URL,甚至在不同的浏览器中从头开始输入。

标签: ruby-on-rails ruby hash parameters hyperlink


【解决方案1】:

您正在从帮助程序中覆盖 params 哈希:当您使用 merge! 时,您正在覆盖原始的 params 哈希。

这应该可行:

# Add the letters parameter to URL if not already there and remove if they are
  def letter_parameters(letters, options = {})
    parameters = params.dup

    if params[:letters] == letters
      # Remove letters
      parameters.delete(:letters)
    else
      # Add letters to new parameters variable
      parameters.merge!(letters: letters)
    end

    # Merge any parameters passed in via options
    parameters.merge(options)
  end

注意使用dup 来创建参数哈希的新副本

【讨论】:

  • 但是在哪里。据我所见,我正在创建一个新的参数变量,它最终作为一个哈希值,其中包含在单击该链接时用作该链接参数的项目?这不对吗?
  • 我已经添加了一个解释和一些代码,应该让它更清楚:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多