Rails form_tag没有处理:动作

时间:2014-01-02 16:55:45

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

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

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

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

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

在我看来: show.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使用以下方法处理:=&gt; :获得

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

提前致谢。

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

以下是一些对实现这一点非常重要的细节:

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

我想要完成的是以下内容:

使用控制器(DeploymentsController)进行评估(部署#show),我想重定向最终用户,如果@ evaluation_template.supports_spanish AND if session [:language](或params [:lang] - 哪个更好)尚未确定。另外,FYI: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] =&gt;提交表单时正确“西班牙语”或“英语”。 表单提交到DeploymentsController,用户可以继续从部署#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

我无法弄清楚为什么这不能正常工作。

非常感谢任何帮助。如果您需要任何其他信息,请告诉我。

1 个答案:

答案 0 :(得分:0)

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