【问题标题】:Rails form_tag not processing :actionRails form_tag未处理:动作
【发布时间】:2014-01-02 16:55:45
【问题描述】:

我已经使用 Rails 工作了几个月了,所以我对它还是很陌生。对于我遇到的问题,我将不胜感激。

我有一个 Rails 应用程序,运行 Rails 3.2.14 和 Ruby 2.0.0-p353。这个 rails 应用程序也使用了 twitter-bootstrap-rails(尽管这与我的问题无关)。

问题:目前表单工作正常。我被要求向应用程序“添加”一些功能(我不是原始开发人员),特别是添加语言选择(西班牙语或英语)作为语言选项。目前,表单中的选择显示为查询字符串参数。基于设置“语言”=“Español”或“英语”参数,我想设置会话[:语言]。

我不打算添加 Rails 国际化 (I18n),因为此实现只会影响应用程序的一小部分本地化部分。我希望设置一个名为“:language”的基于会话的 cookie 变量,以便在整个会话过程中使用。根据 ":language" 的值,应用程序将显示正确的语言文本。当我尝试将 :action => "set_language" 添加到 form_tag 时,没有任何反应。就像它根本没有得到处理一样。

在我看来: 显示.html.haml:

- elsif @evaluation_template.supports_spanish
      .span5{style: "text-align:center;padding-top:30px"}
        = image_tag 'layout/kn-logo.png'
      .well.span5
        %h2 Setup / Disposición
        %br
        = form_tag deployment_path(@deployment, :anchor => "question/1"), :method => :get do
          %p
            Please select your preferred language:
            %br
            Seleccione su idioma preferido:
            %br
            = select_tag :language, "<option>English</option><option>Español</option>".html_safe
            %p
              Please select the position of the evaluator:
              %br
              Por favor seleccione la posición del evaluador:
              %br
                = select_tag 'job_type', @evaluation_template.all_job_types.collect {|job_type_name| "<option value='#{job_type_name}'>#{job_type_name}"}.join('').html_safe
              %p
                Select team members to be excluded from this survey:
                %br
                Seleccionar a los miembros a ser excluidos de esta encuesta:
                %br
                - @deployment.evaluation_instances.each do |instance|
                  = check_box_tag 'exclude[]', instance.team_member.id
                  = instance.team_member.name
                %br
                %br
                  = submit_tag "Begin evaluation / Comenzar la Evaluación", :class => 'begin btn btn-large btn-primary'

在我的控制器中,我添加了以下代码来支持设置会话变量:

def set_language
  session[:language] = params[:language]
end

提交时,表单由 DeploymentsController#show 处理,使用方法:=> :get

我无法弄清楚的问题是,如何将 :action => "set_language" 添加到 form_tag 中?或者有没有更好的方法来做到这一点。如果我遗漏了任何其他信息,请告诉我。

提前致谢。

所以我决定添加一个单独的表单/控制器,以允许最终用户选择他们的语言偏好。

这里有一些对完成此任务很重要的细节:

最终用户通过电子邮件收到 URL,他们单击该 URL,将他们带到评估页面(以便他们完成评估)。如果最终用户的评估设置为允许多语言(西班牙语/英语)支持,则 @evaluation_template.supports_spanish = 1(它在模型中)。

我想要完成的是:

使用控制器 (DeploymentsController) 进行评估 (deployments#show),如果 @evaluation_template.supports_spanish AND if session[:language](或 params[:lang] - 以更好者为准),我想重定向最终用户尚未设置。另外,仅供参考:params[] 已在此应用程序中使用(这就是为什么我考虑设置 params[:lang],然后根据 params[:lang] 设置 session[:language])。

我已将以下内容添加到正确重定向的 DeploymentsController 中:

if @evaluation_template.supports_spanish && params[:lang].nil?
  redirect_to :controller => 'languages', :action => 'show' and return
end

AND(为了确定 params[:lang] 是否已设置,一旦用户在选择他们的语言后返回)。

if params.has_key? :lang
  session[:language] = params[:lang]
end

我创建了一个新的控制器(LanguagesController),它具有以下内容:

def show
  options = Hash.new

  @deployment = Deployment.find_by_uuid(params[:id]) || Deployment.find(params[:id])
  @evaluation_template = @deployment.evaluation_instances.first.evaluation_template

  session[:language] = params[:lang]

end

我的促进途径:

resources :languages
get '/languages', to: 'languages#show', as: :set_language

和我的新表单(视图)show.html.haml:

- if params[:lang].nil?
  #welcome-container
    #row-fluid
      #span12
        .span5{style: "text-align:center;padding-top:30px"}
          = image_tag 'layout/xxxx.png'
        .well.span5
          %h2 Setup / Disposición
          %br
          = form_tag deployment_path(@deployment), :method => :get do
            %p
              %br
              Please select your preferred language:
              %br
              Seleccione su idioma preferido:
              %br
                  = select_tag :lang, "<option>English</option><option>Español</option>".html_safe
            %p
            = submit_tag "Next", :class => 'begin btn btn-large btn-primary'

就目前而言,我可以重定向到新表单,并且可以选择语言首选项。这也正确设置了 params[:lang],并且在提交表单时也正确设置了 session[:language] => "Spanish" 或 "English"。 表单提交到 DeploymentsController,用户可以继续从 deployments#show 视图中选择他们(语言选择我还需要修改):

- if params[:job_type].nil?
#welcome-container
  #row-fluid
    #span12
      .span5{style: "text-align:center;padding-top:30px"}
        = image_tag 'layout/xxxx.png'
      .well.span5
        %h2 Setup
         = form_tag deployment_path(@deployment, :anchor => "question/1"), :method => :get do
          %p
            Please select the position of the evaluator:
            %br
            = select_tag 'job_type', @evaluation_template.all_job_types.collect {|job_type_name| "<option value='#{job_type_name}'>#{job_type_name}"}.join('').html_safe
          %p
            Please select any team members you would like to exclude from this survey:
            %br
            - @deployment.evaluation_instances.each do |instance|
              = check_box_tag 'exclude[]', instance.team_member.id
              = instance.team_member.name
              %br
          = submit_tag "Begin evaluation", :class => 'begin btn btn-large btn-primary'

当用户提交此表单时,他们被重定向到错误的路径(因此,未设置 params[:lang] 和 session[:language]。

/languages/88#question/1

与 form_tag 中的内容相反:

= form_tag deployment_path(@deployment, :anchor => "question/1"), :method => :get do

我不明白为什么这不能正常工作。

任何帮助将不胜感激。如果您需要任何其他信息,请告诉我。

【问题讨论】:

  • 如果我没记错的话,表格用于更新的不仅仅是语言。如果您想单独更新语言,则首先需要一个新表单。如果您能确认,我可以进一步帮助您。
  • 你是对的。该表格当前设置以下内容: 评估者的职位,以及排除任何要排除在评估之外的团队成员。我想要做的是将语言选择也添加到同一个表单中。
  • 另外 - 目前表单是通过部署#show 使用 GET 方法处理的。这是我的问题的症结所在:我可以在表单中添加一个 : 操作以允许我还设置会话变量吗?
  • 如果您向表单添加操作,则整个表单将仅提交给该操作。您可以做的是在当前操作本身中设置会话变量。如果不允许,您需要一个新表格
  • 好的,所以我需要尝试做的是,尝试在show方法中设置会话变量,对吗?

标签: ruby-on-rails forms session-variables


【解决方案1】:

form_tag 方法将第一个参数作为 url。所以在你的情况下 url(action) = deployment_path

form_tag(deployment_path(@deployment, :anchor => "question/1"), :method => :get)

deployment_path 将在 routes.rb 中定义为“部署”

如果您想更改此表单的操作,请将其更改为类似

form_tag(set_language_path, :method => :get)

但请确保您的路线已定义 set_language。 比如:

get "/language" => "language#show", :as => :set_language

【讨论】:

  • 如果我无法将语言设置为相同的形式,我相信这就是我最终不得不做的事情。如果无法做到这一点,我可能必须添加一个视图/控制器操作,以允许用户提交他们的语言、处理请求并登陆上述视图。
  • 您能否根据我提供的新信息提出建议?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
  • 2011-09-21
  • 2018-03-19
相关资源
最近更新 更多