【问题标题】:How to pass params to rails form correctly如何正确地将参数传递给rails表单
【发布时间】: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

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

【问题讨论】:

    标签: ruby-on-rails forms model-view-controller parameters


    【解决方案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 方法。

      【讨论】:

        猜你喜欢
        • 2016-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-29
        • 2014-04-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多