如何正确地将参数传递给rails表单

Posted

技术标签:

【中文标题】如何正确地将参数传递给rails表单【英文标题】:How to pass params to rails form correctly 【发布时间】:2021-07-12 01:33:32 【问题描述】:

我是学习 Rails 的新手。我想尝试创建一个简单的应用程序,用户可以在其中写帖子,然后其他人可以对他们的帖子发表评论。

我有 3 个模型。用户、帖子和评论。创建新评论时,我无法将参数中的 post_id 和 user_id 带入。

这是我在 cmets 控制器中的新方法

  def new
    @comment = Comment.new(user_id: params[:user_id], post_id: params[:post_id])
  end

在我的服务器中,我似乎正在传递 params 键(不确定这是否是正确的术语)并且我正在寻找值。

Started GET "/comments/new?post_id=post_id&user_id=user_id" for ::1 at 2021-04-16 22:40:14 -0700
   (0.1ms)  SELECT sqlite_version(*)
Processing by CommentsController#new as html
  Parameters: "post_id"=>"post_id", "user_id"=>"user_id"
  Rendering comments/new.html.erb within layouts/application
  Rendered comments/_form.html.erb (Duration: 1.5ms | Allocations: 715)
  Rendered comments/new.html.erb within layouts/application (Duration: 1.8ms | Allocations: 814)
[Webpacker] Everything's up-to-date. Nothing to do
Completed 200 OK in 18ms (Views: 9.9ms | ActiveRecord: 0.6ms | Allocations: 10798)

我传递的参数是“post_id”,它应该是一个与正确帖子对应的整数。

我不确定要谷歌什么来弄清楚如何获取参数。我想也许它嵌套在 cmets 控制器下所以我试过了

  def new
    @comment = Comment.new(user_id: params[:comments][:user_id], post_id: params[:comments][:post_id])
  end

这破坏了我的代码。我不知所措。我不知道用什么谷歌来尝试解决这个问题。任何帮助将非常感激。谢谢。

【问题讨论】:

【参考方案1】:

我的建议是不要在“GET”方法中传递大量参数。使用 post 方法,对于@thibault 提到的强参数,您需要按以下格式传递参数

"comments" => "post_id"=>"post_id", "user_id"=>"user_id" 

在新动作中,你只需要渲染表单,在表单中输入值后,使用'POST'方法创建评论。 Rails 中有很多表单助手,你可以在这里查看它们https://guides.rubyonrails.org/form_helpers.html 我建议你使用 rails form helper 'form_with' - https://apidock.com/rails/ActionView/Helpers/FormHelper/form_with

如果您不熟悉 Rails,请使用“脚手架”并通过观察每个操作的代码和日志来了解事物。

   rails generate scaffold Comment 

【讨论】:

【参考方案2】:

你需要通过强参数: https://api.rubyonrails.org/v6.1.3/classes/ActionController/StrongParameters.html

def create
  @comment = Comment.new(comment_params)
end

private

def comment_params
  params.require(:comment).permit(:user_id, :post_id)
end

除此之外,我认为您应该为您的 http 请求使用 post 方法。

【讨论】:

以上是关于如何正确地将参数传递给rails表单的主要内容,如果未能解决你的问题,请参考以下文章

如何正确地将参数传递给 joomla 组件?

如何最好地将 CString 转换为 BSTR 以将其作为“in”参数传递给 COM 方法?

如何迭代地将参数传递给 R 函数

如何正确地将参数传递给基于类的视图测试 Django Rest Framework?

如何有条件地将参数传递给 Flutter/Dart 中的 Widget?

将组合框作为参数传递给表单