Ruby on Rails 6:表单通过隐藏字段提交哈希数组,但被

问题描述 投票:0回答:1

关于帖子形式的错误,上面写着'用户必须存在'。

正在接收包括user_id在内的正确参数,但是所有参数仍然被拒绝。我怀疑它与散列数组有关,因为它们来自另一个控制器,但通过某种形式。

因此,当我检查Post参数时,它说:

<ActionController::Parameters {"email"=>"[email protected]", "user_id"=>"2", "items_bought"=>"[#<LineItem id: 3, product_id: 1, cart_id: 3, quantity: 1>, #<LineItem id: 4, product_id: 2, cart_id: 3, quantity: 4>]"} permitted: false>

Simple_form_for @post

<%= simple_form_for @post, :url => user_posts_path do |f| %>

  <%= f.error_notification %>

  <ul>

    <%= @post.errors.full_messages.each do |message| %>
      <li><%= message %></li>
    <%end%>

  </ul>

   <%= f.input :email, :input_html => { value: "#{current_user.email}" } %>
   <%= f.input :user_id, :as => :hidden, :input_html => { value: "#{current_user.id}" } %>
   <%= f.input :items_bought, :as => :hidden, :input_html => { value: "#{current_cart.line_items.to_a}" } %>

   <%= f.error :base %>
   <%= f.button :submit %>

<% end %>

Posts controller

class PostsController < ApplicationController

 def new
    @user = current_user
    @post = Post.new
 end

 def create
    @user = current_user
    @post = current_user.posts.build(params[:post_params])

  if @post.save 
    render plain:
    params[:post].inspect
  else
    render 'new'
  end

  end

  private

  def post_params
    params.require(:post).permit(:email, :user_id, items_bought: [:LineItem_id [], :product_id[], :cart_id[], :quantity[]])
  end
end

Post Model

class Post < ApplicationRecord

  belongs_to :user, dependent: :destroy


end

任何帮助将不胜感激

arrays ruby-on-rails forms hash actioncontroller
1个回答
0
投票

您未使用post_params方法,请更改此:

@post = current_user.posts.build(params[:post_params])

对此:

@post = current_user.posts.build(post_params)

编辑:请注意,将user_id作为参数传递会带来安全风险,因此有人可以更改隐藏字段的值。使用current_user ID而不是从表单接收ID。

实际上,所有隐藏信息都是从current_user中检索的,您实际上并不需要使用隐藏字段,因为如果您有权访问current_user,那么您已经可以访问所有这些信息(id,购物车商品)

编辑2:如果要在:items_bought参数中包含哈希数组,则需要使用多个具有特定名称的隐藏字段,以便将其解析为Rails的哈希。

假设您具有此结构:

[
  {
    id: 1,
    name: 'Foo',
    some_attr: 'Lorem'
  },
  {
    id: 2,
    name: 'Bar',
    some_attr: 'Impsum'
  }
]

如果将其作为参数发送,则需要多个隐藏字段:

hidden_field_tag 'items_bought[1][id]', 1
hidden_field_tag 'items_bought[1][name]', 'Foo'
hidden_field_tag 'items_bought[1][some_attr]', 'Lorem'
hidden_field_tag 'items_bought[2][id]', 2
hidden_field_tag 'items_bought[2][name]', 'Bar'
hidden_field_tag 'items_bought[2][some_attr]', 'Impsum'

提交后,params[:items_bought]将为:

{
  '1' => {
    id: '1',
    name: 'Foo',
    some_attr: 'Lorem'
  },
  '2' => {
    id: '2',
    name: 'Bar',
    some_attr: 'Impsum'
  }
}

[请注意,它是不同的,它是一个哈希哈希,如果每个哈希都是键,则您具有ID(这是隐藏字段名称items_bought[1]items_bought[2]的第一部分,ID是字符串,而不是数字) 。

您还可以将哈希序列化为字符串:

hidden_field_tag :items_bougth, my_hash.to_json

然后在控制器上执行

param_hash = JSON.parse(params[:items_bought]

但是我不建议这样做,这表明它已经完成了一些比所需的复杂的事情,您需要解析参数,使用额外的库,等等。

[请注意,您不应该对像LineItem这样的复杂对象进行任何此类操作,要谈论的是哈希数组,LineItems数组不是哈希数组,您必须先将这两种方法的对象都转换为哈希值持续工作。

© www.soinside.com 2019 - 2024. All rights reserved.