Rails передает параметры на страницы и вызывает различные методы на их основе - PullRequest
1 голос
/ 23 ноября 2011

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

Что я пытаюсь сделать:

У меня есть шаблон (view) с именем search.html.erb, где я хочу, чтобы в зависимости от ввода пользователя вызывались разные методы, в частности, переменные, передаваемые по ссылке на предыдущей странице. Например, если пользователь нажмет на ссылку «запятые», он передаст что-то вроде

search?type=commas

(Я заменил действие на тип, потому что я понимаю, что «действие» зарезервировано в Rails для методов, объявленных внутри контроллера). Файл маршрута имеет это:

  match ':controller/:action/:type/'

Что должно позволить мне сделать "http://localhost:3000/actors/search/commas как способ передачи типа" запятые "?

Тогда страница поиска будет вызывать метод showCommas из модели актеров:

def self.showCommas
    @commas = self.where("actor LIKE ?", "%,%,%")
end

Если бы они нажали на "острый", он бы прошел

search?type=acute

И эта страница будет вызывать острый метод в модели актеров.

Наконец, я также хочу, чтобы они могли передавать поисковый термин, и страница поиска выполняла бы SQL-запрос с этим термином, используя .find_by_sql.

Это просто реализовать в PHP, я просто использую

if ($_GET[action] == 'commas') { ...

Но как это сделать в Rails? Проблемы у меня:

Если я создаю метод в контроллере Actor для поискового запроса:

def search(term)    
    Actor.find_by_sql([sql query here with '%#{term}%']) 
end

Rails будет жаловаться, что у меня слишком много аргументов для метода в контроллере. Итак, я переместил все свои методы в модель (догадываясь, что тогда это правильный путь?)

Поместив это на мою страницу search.html.erb:

if type.nil?
    criteria = "No type specified"
elsif type == 'commas' 
    criteria = type
    @actors = Actor.showCommas
end

Немедленно выдает ошибку о том, что переменная типа не определена: неопределенная локальная переменная или метод `type '

Итак, я сделал большой беспорядок, но, как ни крути Rails, исходя из PHP, довольно сложно обдумать способ работы Rails. Я понимаю основную философию наличия представления с тем же именем, что и ваше действие, и Rails будет его называть, но я не хочу создавать одну страницу для каждого запроса (или другой мелочи), которую мне нужно сделать. Кроме того, книги, которые я прочитал, похоже, не вдавались в подробности об этом, поэтому, опять же, спасибо за вашу помощь и поблажку задавать несколько вопросов в одном посте.

Ответы [ 2 ]

0 голосов
/ 23 ноября 2011

Трудно полностью ответить на этот вопрос, так как мало информации не хватает, но, надеюсь, это направит вас в правильном направлении. Ваш search?type=commas URL будет перенаправлен на контроллер актеров, где, судя по всему, у вас есть метод поиска. Тип = запятые будут доступны в хэше params (params [: type]).

В rails рекомендуется использовать как можно больше логики в модели, поэтому, если исходить из php, было бы естественно сделать что-то подобное в вашем контроллере:

def search  
    if params[:type] 
        if params[:type] == "commas"
            ... search logic
        elsif
            ... other search logic
        end 
    end
end

В Rails метод контроллера, использующий ваше соглашение об именах, выглядел бы так:

def search 
    @actors = Actor.search(params[:type])
end

Обратите внимание на params[:type] для доступа к вашему параметру типа url. То, как вы это написали, вы указали в качестве аргумента метода контроллера, который является неправильным, поскольку методы контроллера не имеют аргументов.

И модель может выглядеть примерно так;

def self.search(type)
    case type
    when "commas"
      Actor.where(:type => "commas")
    when "whatever"
      Actor.where(:type => "whatever")
    else
      Actor.all
    end
end

Ваш метод поиска, очевидно, будет сильно отличаться, но это всего лишь пример того, как передавать параметры от URL до модели.

0 голосов
/ 23 ноября 2011

Не делайте этого в модели, делайте это в контроллере.Вы автоматически получаете параметры GET (как в PHP).Это в хэше params.Вы можете, например, выполнить кейс:

def search
  case params[:type]
  when 'commas'
    search_with_commas
  when 'acute'
    search_with_acute
  ...
  else
    default_search
  end
end

private
  def search_with_commas
     ...
  end

  ...

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

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