Автоматически добавлять параметры в методы * _url или * _path (Rails) - PullRequest
2 голосов
/ 18 ноября 2010

У меня есть определенный набор представлений, относящихся к одному из моих контроллеров, при котором я хочу, чтобы любой вызов к *_path или *_url добавлял набор параметров.

Есть ли какой-нибудь магический метод, который я могу переопределить, который позволит мне сделать это? Я понятия не имею, где в коде Rails методы *_path или *_url даже обрабатываются.

Редактировать для ясности: Я ищу способ сделать это так, чтобы мне не приходилось изменять каждую ссылку в каждом представлении, где это должно происходить. Я не хочу, чтобы каждый программист, который касается этого набора представлений, должен был помнить, чтобы добавлять параметр к каждой ссылке, которую они добавляют на страницу. Этот же параметр должен быть добавлен автоматически. Я считаю, что изменение *_url или *_path вызовет сбой. Точно так же необходимость переопределять каждый вызов *_url или *_path считается ошибкой, поскольку каждый раз при добавлении / удалении новой ссылки придется добавлять / удалять новый метод.

Ответы [ 4 ]

7 голосов
/ 19 ноября 2010

Благодаря ответу Самуила я смог создать окончательное рабочее решение с помощью нового помощника, который я включил ниже.

module ExampleHelper
  def url_for(options={})
    options = case options
    when String
      uri = Addressable::URI.new
      uri.query_values = @hash_of_additional_params

      options + (options.index('?').nil? ? '?' : '&') + uri.query
    when Hash
      options.reverse_merge(@hash_of_additional_params)
    else
      options
    end

    super
  end
end
7 голосов
/ 19 ноября 2010

Вы можете сделать это, переопределив url_for, так как все методы маршрутизации вызывают его.

module ApplicationHelper
  def url_for(options = {})
    options.reverse_merge!(@extra_url_for_options) if @extra_url_for_options
    super
  end
end

Теперь все, что вам нужно сделать, это использовать before_filter, чтобы установить @extra_url_for_options в хэшзаставить все URL.

class MyController < ApplicationController
  before_filter do { @extra_url_for_options = { :format => 'html' } }
end

Обратите внимание, что это заставит все ссылки использовать дополнительные опции.

1 голос
/ 18 ноября 2010

Вы можете попробовать использовать метод with_options . По вашему мнению, вы можете сделать что-то вроде

<% with_options :my_param => "my_value" do |append| -%>

  <%= append.users_path(1) %>

<% end %>

Предполагая, что у вас есть путь_пользователя, конечно. my_param = значение будет добавлено к URL

0 голосов
/ 18 ноября 2010

Вы можете создать вспомогательный метод:

def my_path(p)
  "#{p}_path all the parameters I want to append"
end

и использовать в представлении

<%= eval(my_path(whatever)) %>

Eval с динамической областью действия, поэтому можно использовать любую переменную, доступную в вашем представлении.в помощнике.Если ваши параметры постоянны, вы можете избавиться от eval вызовов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...