Params []呼叫在控制器中返回nil

时间:2015-04-05 02:51:31

标签: ruby-on-rails

我有一个脚手架视图 comments / new ,它允许用户输入:body和:lunch_id。表单打开时,URL字符串为:

http://localhost:3000/comments/new?lunch_id=1

我正在尝试使用下面的comments_controller创建方法读取url字符串来更新_attribute lunch_id:

def create
  lunch_id = params[:lunch_id]
  @commenttest = Comment.new(comment_params)
  @commenttest.update_attribute(:lunch_id, lunch_id)
  @commenttest.save
end

问题是params [:lunch_id]总是返回一个nill。为什么它不会读入URL字符串?

我已经好几个小时了,所以任何想法都会有所帮助

编辑:

以下是来自hello world应用程序中重新创建的环境的rake路由。这只有几页,但参数[:lunch_id]仍为零:

Prefix      Verb    URI Pattern                     Controller#Act

> comments      GET     /comments(.:format)             comments#index
>               POST    /comments(.:format)             comments#creat
> new_comment   GET     /comments/new(.:format)         comments#new
> edit_comment  GET     /comments/:id/edit(.:format)    comments#edit
> comment       GET     /comments/:id(.:format)         comments#show
>               PATCH   /comments/:id(.:format)         comments#updat
>               PUT     /comments/:id(.:format)         comments#updat
>               DELETE  /comments/:id(.:format)         comments#destr
> say_hello     GET     /say/hello(.:format)            say#hello
> say_goodbye   GET     /say/goodbye(.:format)          say#goodbye

2 个答案:

答案 0 :(得分:0)

我猜你在new.html.erb中有一个表单,当你点击提交时,它会发布信息并调用你的create操作,当你的params[:lunch_id]时1}}是nil

发生这种情况的原因是因为params哈希在您执行操作时没有永久性。每次从浏览器发出请求时,Web服务器基本上都会从头开始执行一个操作。当您访问/comments/new?lunch_id=1时,您正在发出GET请求,该请求已映射到您的CommentsController new操作。但是,当您提交表单时,您正在向POST路径发出/comments个请求,因此请调用CommentsController create次操作。但这是一个新请求,带有一个全新的params哈希,由新请求的路径和表单提交的数据生成。

因此,解决问题的简单方法是添加一个新字段来跟踪您的参数:

<%= form_for(@comment) do |f| %>
  <%= hidden_field_tag :lunch_id, params[:lunch_id] %>

  . . . .

<% end %>

然而,您似乎正在尝试为午餐创建评论,正确的做法是使用嵌套属性:

#/config/routes.rb
resources :lunches do
  resources :comments
end

通过这种方式,您可以在GET /lunches/1/comments/new中获取新评论的表单并将其指向POST /lunches/1/comments,并且rails会自动设置params[:lunch_id]值,而无需您将其置于其中了。

答案 1 :(得分:0)

正如AbM所指出的,params [:lunch_id] create方法无法看到http://localhost:3000/comments/new?lunch_id=1 URL字符串。但是,新方法可以看到URL字符串。

因此,应在新方法中设置实例变量:

  def new
    @comment = Comment.new
    @lunch_id = params[:lunch_id]
  end

然后,表单本身应该有一个指向此变量的隐藏字段:

  <div class="field">
    <%= f.label :lunch_id %><br>
    <%= f.hidden_field :lunch_id, :value => @lunch_id %>
  </div>

使用create方法提交表单时,隐藏字段已经从URL字符串中获得了正确的lunch_id。