【问题标题】:Beginner trouble with Rails formRails 表单的初学者问题
【发布时间】:2014-03-01 01:26:06
【问题描述】:

我正在使用 Rails 3.2。

我正在尝试制作一个表单,允许用户输入他们想要比较的大学,以及他们想要查看比较的标准。这是我的代码。当我提交表单时,它会重定向回页面,但不会显示 h1 标签中的参数。怎么了?

控制器

class ComparisonController < ApplicationController
  def view
    @summaries = Summary.all
    @colleges = College.all
  end

  def update
    @college_listing = params[:comparison][:college]
    @summary_listing = params[:comparison][:section]
    redirect_to '/comparison', college_listing: "#{@college_listing}", summary_listing: "#{@summary_listing}", notice: 'Showing comparison.'
  end
end

查看

<%= simple_form_for :comparison, :url => '/comparison/update' do |f| %>
    <%= f.input :college, collection: ['University of Pittsburgh', 'University of Wisconsin - Madison', 'Colgate', 'Adelphi'], :input_html => { :multiple => true } %>
    <%= f.input :section, collection: ['Professors', 'Classes', 'Difficulty', 'Campus', 'Food', 'Dorms', 'Safety', 'Social Atmosphere', 'Parties', 'Actuarial Science', 'Agriculture', 'Applied Math', 'Astronomy', 'Biology', 'Chemistry', 'Computer Science', 'Earth Science', 'Geology', 'Linguistics', 'Mathematics', 'Neuroscience', 'Physics', 'Statistics', 'Anthropology', 'Criminology', 'Economics', 'History', 'Political Science', 'Psychology', 'Sociology', 'Urban Studies', 'Women\'s Studies', 'Art', 'Classics', 'English', 'Film', 'History and Philosophy of Science', 'Literature', 'Music', 'Philosophy', 'Religious Studies', 'Theatre', 'African', 'Chinese', 'French', 'German', 'Italian', 'Japanese', 'Jewish', 'Latin American', 'Middle Eastern', 'Russian', 'Spanish', 'Other', 'Accounting', 'Finance', 'Management', 'Marketing', 'Bioengineering', 'Chemical', 'Civil', 'Computer', 'Electrical', 'Engineering Science', 'Industrial', 'Materials Science and Engineering', 'Mechanical', 'Nuclear', 'Architecture', 'Athletic Training', 'Communications/Journalism', 'Information Science', 'Nursing', 'Nutrition', 'Pharmacy', 'Public Health', 'Rehab Science', 'Social Work'], :input_html => { :multiple => true } %>
    <%= f.button :submit %>
<% end %>

<h1><%= params[:college_listing] %></h1>

<h1><%= params[:summary_listing] %></h1>

【问题讨论】:

  • 我有大声笑。我做了 Michael Hartl's, One Month Rails 和 learn-rails 教程。虽然仍在挣扎:/
  • 我不明白。当我提交表单时,它会进入更新操作。然后我必须使用可用的变量重定向回视图操作。我如何使它们可用?视图操作无权访问提交的表单参数,所以我能想到的唯一方法是通过典型的 url 参数。
  • @mbratch 我在视图中尝试了&lt;h1&gt;&lt;%= @college_listing %&gt;&lt;/h1&gt; &lt;h1&gt;&lt;%= @summary_listing %&gt;&lt;/h1&gt;,但没有成功。您是说控制器中的所有实例变量都可用于所有控制器操作吗?
  • 你能解释一下“没用”吗?您是否收到了错误,或者只是不是您预期的数据?

标签: ruby-on-rails ruby-on-rails-3 forms ruby-on-rails-3.2


【解决方案1】:

在你的控制器中试试这个:

def update
    @college_listing = params[:comparison][:college]
    @summary_listing = params[:comparison][:section]
    flash[:notice] = 'Showing comparison'
    redirect_to :controller => 'comparison', :action => 'view', :college_listing => @college_listing, :summary_listing => @summary_listing   
end

至于为什么它以前不起作用 -

redirect_to 具有以下签名:

def redirect_to(options = {}, response_status = {})

当您使用 url 的字符串调用它时,它会将选项哈希设置为您传入的字符串,之后的所有内容都将成为 response_status 并且不会作为 get 参数附加到 url。

如果您希望在 redirect_to 调用中传递 Flash 通知,那么您最好调用命名路由(运行 rake routes 以查找到 comparison#view 的路由 - 它可能只是 `comparison_url'。然后像这样制定你的电话:

redirect_to comparison_url(:college_listing => @college_listing, :summary_listing => @summary_listing ), :notice => 'Showing comparison'

使用括号中的参数调用 comparison_url 将为 Rails 重定向到正确的 get 请求 - 在这种情况下,您实际上是在将 proc 传递给 redirect_to。

如果您喜欢,Rails 代码并不是那么令人生畏 - 这里是 redirect_to https://github.com/rails/rails/blob/3-2-stable/actionpack/lib/action_controller/metal/redirecting.rb

调用redirect_to 时Rails 响应的各种方式归结为私有方法_compute_redirect_to_location

【讨论】:

  • 成功了,谢谢!据我所知(我正在努力学习),你能解释一下出了什么问题,为什么它以前不起作用?另一个人在帮助我,我们尝试了一些 foo 测试,但来自 redirect_to 的参数没有被传递。
  • 另外,在我添加 &lt;% if flash[:notice] %&gt; &lt;div id="notice"&gt;&lt;%= flash[:notice] %&gt;&lt;/div&gt; &lt;% end %&gt; 后,:notice 不起作用。你知道为什么吗?
  • 更新了我的答案 - 抱歉原来的 notice 是错误的 - 它现在应该可以工作了。希望解释也有意义
  • 谢谢,现在可以使用并且更有意义。那么为什么必须调用命名路由才能传入:notice?是因为:noticeresponse_status 的一部分吗? response_status 到底是什么?
  • 你不必调用命名路由来获得 :notice 工作。你可以做redirect_to '/comparison', :notice =&gt; 'foo'。但是,当您要传递变量时,调用命名路由(实际上是一个方法)允许您将参数传递给命名路由方法,该方法会生成附加参数的 get 请求。然后你也可以传递 flash 参数。如果您传递一个字符串作为路由,那么之后的所有内容最终都会放入 response_status,因此您的闪存将通过,但变量将被丢弃。 response_status 用于 http 状态,例如 404 not found 等
猜你喜欢
  • 1970-01-01
  • 2012-09-14
  • 1970-01-01
  • 2011-11-07
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多