в Rails: получить пользовательский ввод из формы, которая не связана с моделью, использовать результат в контроллере - PullRequest
1 голос
/ 20 сентября 2008

Вот упрощенная версия того, что я пытаюсь сделать:

  1. Перед выполнением любых других действий предоставьте пользователю форму для извлечения строки.
  2. Введите строку, а затем перенаправьте на действие контроллера по умолчанию (например, индекс). Строка должна существовать только, никаких других проверок не требуется.
  3. Строка должна быть доступна (как переменная экземпляра?) Для всех действий в этом контроллере.

Я очень новичок в Rails, но, похоже, это не должно быть слишком сложно, поэтому я чувствую себя немного тупым.

Что я пробовал: У меня before_filter перенаправление на закрытый метод, который выглядит как

def check_string
  if @string
    return true
  else
    get_string
  end
end

метод get_string выглядит как

def get_string
  if params[:string]
    respond_to do |format|
      format.html {redirect_to(accounts_url)} # authenticate.html.erb
    end
  end

  respond_to do |format|
    format.html {render :action =>"get_string"} # get_string.html.erb
  end
end

Это не удалось, потому что у меня два вызова рендеринга или перенаправления в одном действии. Конечно, я могу вынести это первое respond_to, но происходит то, что контроллер попадает в ловушку в методе get_string. Я могу более или менее понять, почему это происходит, но я не знаю, как это исправить и вырваться. Мне нужно иметь возможность показать одну форму (View), получить и затем что-то сделать с входной строкой, а затем продолжить как обычно.

Файл get_string.html.erb выглядит как

<h1>Enter a string</h1>
<% form_tag('/accounts/get_string') do %>
<%= password_field_tag(:string, params[:string])%>
<%= submit_tag('Ok')%>
<% end %>

Я буду благодарен за любую помощь!

EDIT

Спасибо за ответы ...
@ Лори Янг: Вы правы, я недоразумение. По какой-то причине у меня было в голове, что экземпляр любого данного контроллера, вызываемого пользователем, будет сохраняться на протяжении всего сеанса, и что некоторая магия Rails заключалась в отслеживании объектов, связанных с каждым сеансом пользователя. Я понимаю, почему в ретроспективе это не имеет большого смысла, и почему моя попытка использовать переменную экземпляра (которая, как я думал, будет сохраняться) не будет работать. Спасибо и вам:)

Ответы [ 2 ]

2 голосов
/ 20 сентября 2008

Частично проблема в том, что вы не устанавливаете @string. Вам вообще не нужен before_filter для этого, и вы должны просто использовать:

def get_string
  @string = params[:string] || session[:string] 
  respond_to do |format|
    if @string  
      format.html {redirect_to(accounts_url)} # authenticate.html.erb
    else 
      format.html {render :action =>"get_string"} # get_string.html.erb
    end
  end
end

Если вы хотите, чтобы переменная @string была доступна для всех действий, вам нужно сохранить ее в сеансе.

0 голосов
/ 20 сентября 2008

Похоже, я пропустил концепцию рельсов. Каждая страница, которую видит пользователь, представляет собой отдельный запрос.

Возможно, я неправильно понял, что вы пытаетесь сделать. Но мне кажется, вы хотите, чтобы пользователь видел две страницы,

  1. На первой странице они устанавливают строковую переменную
  2. На второй странице они видят страницу, которая каким-то образом зависит от набора переменных

Лучший способ сделать это - использовать фильтр before, который проверяет наличие переменной, и, если она не установлена, перенаправляет их в форму и в противном случае продолжает

class MyController < ApplicationController::Base
  before_filter :require_string

  def require_string
    return true if @string #return early if called multiple times in one request
    if params['string'] or session['string']  #depending on if you set it as a URL or session var
      @string = (params['string'] or session['string'])
      return true
    end

    #We now know that string is not set
    redirect_to string_setting_url and return false #the return false prevents any futher processing in this request
  end
end

Это основная идея работы таких плагинов, как RestfulAuthentication. В этом случае «строка» является токеном входа в систему (идентификатор пользователя, я думаю), хранится в сеансе.

Если вы посмотрите на login_required' action in authenticated_system.rb` из ResultfulAuth: в основном это происходит, хотя в нем есть еще несколько исправлений ошибок, другие вещи добавлены в

...