Создайте ссылку в партиале, которая сохраняет параметры URL-адреса родительского представления.

У меня есть представление с частичным, например:

# my_controller/my_view
The value of the parameter is <%= @parameter %>
<%= render :partial "my_contoller/my_partial", locals: {internal_param: @parameter_for_partial %>

#my_controller/my_partial
<div>
  The value of the internal parameter is <%= internal_param %><br />
  <%= link_to "Link", {:partial_url_param => internal_param + 1} %>
</div>

Действие контроллера принимает параметры URL:

def class MyControllerController < ApplicationController
  def my_action
    @parameter = params[:parent_view_url_param]
    @parameter_for_partial = params[:partial_url_param]
  end
end

Теперь, когда я захожу на /my_controller/my_view?parent_view_url_param=1&partial_url_param=2, я получаю страницу, которая выглядит так:

The value of the parameter is 1
<div>
  The value of the internal parameter is 2<br />
  <a href="/my_controller/my_view?partial_url_param=3">Link</a>
</div>

Я хочу, чтобы ссылка указывала на /my_controller/my_view?parent_view_url_param=1&partial_url_param=3, при этом все параметры URL-адреса из исходной ссылки были такими же, кроме тех, которые частично переопределяются. Более того, если бы я добавил больше параметров, я бы хотел, чтобы ссылка в партиале сохраняла и их, не требуя от меня каких-либо изменений в партиале.

Есть ли способ сделать это в Rails 4?


person Kevin    schedule 28.07.2013    source источник


Ответы (2)


Как насчет

=link_to 'Link', params.merge(partial_url_param: internal_param + 1)
person bgates    schedule 28.07.2013
comment
Я смотрю на это прямо сейчас. Единственное, что меня беспокоит, это то, что если включены некоторые чувствительные параметры, такие как authenticity_token, мы должны удалить их перед выполнением слияния. - person Kevin; 29.07.2013
comment
Вы можете заменить params на params.except(sensitive_params). - person bgates; 29.07.2013

Используя метод в ответе bgates, я создал этот вспомогательный метод и поместил его в application_helper.rb:

  # Creates a link back to the current view, keeping all of
  # the URL parameters the same except some that you
  # change. Also strips out some URL parameters that can
  # have implications for the app's security.
  #
  # Input params:
  # link_name: The text to show for the link
  # original_params: The params hash available to the view
  # params_to_change: A hash in the format of
  #   orignal_params that indicates which URL parameters
  #   to change, and what to change them to
  # html_options (optional): The HTML options to apply
  #   to the link
  #
  # Output: The HTML for a link back to the view with some
  #   of the URL parameters changed, as specified by
  #   the params_to_change hash
  def link_to_with_same_params(link_name, original_params, params_to_change, html_options = {})
    send_params = original_params.deep_dup
    send_params.delete :authenticity_token
    send_params.delete :commit
    send_params.merge! params_to_change
    return link_to link_name, send_params, html_options
  end

Что позволяет мне сделать это в моем примере:

#my_controller/my_partial
<div>
  The value of the internal parameter is <%= internal_param %><br />
  <%= link_to_with_same_params "Link", params, {:partial_url_param => internal_param + 1} %>
</div>
person Kevin    schedule 28.07.2013