1

这是我正在尝试做的简化版本:

  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方法中。我或多或少可以看出为什么会这样,但我不知道如何解决它并爆发。我需要能够显示一个表单(视图),获取然后对输入字符串执行某些操作,然后正常进行。

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 %>

我会感谢任何帮助!

编辑

感谢您的回复......
@Laurie Young:你是对的,我误会了。出于某种原因,我认为用户调用的任何给定控制器的实例都会在他们的会话中持续存在,并且 Rails 的一些魔力在于跟踪与每个用户会话关联的对象。我可以看到为什么回想起来这并没有多大意义,以及为什么我尝试使用实例变量(我认为会持续存在)不起作用。也谢谢你:)

4

2 回答 2

2

部分问题是您没有设置@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 变量可用于所有操作,则需要将其存储在会话中。

于 2008-09-20T01:52:24.483 回答
0

看起来我就像你缺少一个 Rails 概念。用户看到的每一页都是不同的请求。

我可能误解了你想要做什么。但在我看来,您希望用户看到两个页面,

  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 之类的插件如何工作的基本思想。在那种情况下,“字符串”是一个登录令牌(我认为是用户 ID),存储在会话中。

如果你看一下login_required' action in来自 ResultfulAuth 的 authenticated_system.rb`:它基本上就是这样做的,虽然它有更多的错误更正,但添加了其他内容

于 2008-09-20T16:00:45.300 回答