我已经和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
我无法弄清楚为什么这不能正常工作。
非常感谢任何帮助。如果您需要任何其他信息,请告诉我。
答案 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