Rails 3: значение контроллера по умолчанию - PullRequest
8 голосов
/ 31 января 2012

Я использую удаленный form_for для своего действия show для извлечения контента на основе параметров, переданных этой формой.

= form_tag  modelname_path(@modelname), :id=>"select_content_form", :remote => true, :method => 'get' do               
  = text_field_tag :content_type, params[:content_type], :id=>"select_content_type"
  = submit_tag "submit", :name => nil, :id=>"select_content_submit"

И я изменяю содержимое в контроллере следующим образом:

# Default params to "type1" for initial load
if params[:content_type]
  @content_type = params[:content_type];
else
  @content_type = "type1"
end

case @content_type

when "type1"
  # get the content
  @model_content = ...

when "type1"
  # get the content
  @model_content = ...

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

ОБНОВЛЕНИЕ Основываясь на предложении ниже, я использовал следующее и получил ошибку в строке defaults.merge:

defaults = {:content_type=>"type1"}
params = defaults.merge(params)
@content_type = params[:content_type]

Ответы [ 3 ]

10 голосов
/ 31 января 2012

Хороший способ установки параметров по умолчанию - это поместить их в хеш и объединить в них входящие параметры.В приведенном ниже коде defaults.merge(params) перезапишет любые значения из хэша params поверх значений по умолчанию.

def controller_method
    defaults = {:content=>"Default Content", :content_type=>"type1"}
    params = defaults.merge(params)
    # now any blank params have default values

    @content_type = params[:content_type]
    case @content_type
        when "type1"
            @model_content = "Type One Content"
        when "type2"
            #etc etc etc
    end
end
6 голосов
/ 01 февраля 2012

Если есть статический список типов, вы можете сделать его выпадающим списком и просто не включать пустой параметр, чтобы что-то всегда выбиралось.Но если вы застряли в текстовом поле, вы можете очистить действие контроллера, используя фильтр before:

class FoosController < ActionController::Base
  before_filter :set_content_type, :only => [:foo_action]

  def foo_action
    ...
  end

  protected

     def set_content_type
       params[:content_type] ||= "type1"
     end
end
1 голос
/ 22 ноября 2013

Я хотел бы добавить к этому обсуждению рабочий способ установки параметров по умолчанию:

defaults = { foo: 'a', bar: 'b' }
params.replace(defaults.merge(params))  

Это позволяет избежать назначения локальной переменной с помощью «params =».

...