我有一个脚手架视图 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
答案 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。