【发布时间】: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