如何修复Rails拒绝从表单发送的参数?

时间:2017-07-21 04:20:37

标签: ruby-on-rails

我在这里有一个表格:

<%= form_for(portfolio) do |f| %>
  <% if portfolio.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(portfolio.errors.count, "error") %> prohibited this portfolio from being saved:</h2>

      <ul>
      <% portfolio.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>
  <%= f.hidden_field :user, value: @user[0]['user_id']%>

  <div class="field">
    <%= f.label :name %>
    <%= f.text_field :name %>
  </div>

  <div class='field'>
    <%= f.label :balance %>
    <%= f.number_field :balance %>
  </div>

  <div class="actions">
    <%= f.submit %>
  </div>

<% end %>

该表单使用隐藏字段将用户信息发送到Portfolio控制器。那时使用了Portfolio create方法

def create
    @portfolio = Portfolio.new(portfolio_params)
    respond_to do |format|
      if @portfolio.save
        format.html { redirect_to @portfolio, notice: 'Portfolio was successfully created.' }
        format.json { render :show, status: :created, location: @portfolio }
      else
        format.html { render :new }
        format.json { render json: @portfolio.errors, status: :unprocessable_entity }
      end
    end
  end

它运行我在控制器中定义的参数测试:

 def portfolio_params
      params.require(:portfolio).permit(:user, :name, :balance)
    end

当我尝试使用该表单创建新的投资组合时,我收到以下错误消息: 用户(#70102221612560)预期,得到字符串(#46914422996540)

这是错误的屏幕截图 Rails error

Rails是否希望我以某种方式将当前用户模型作为参数发送?它说这是一种不匹配的类型,但我不确定在哪里设置预期参数的“类型”。

2 个答案:

答案 0 :(得分:0)

您需要更改表单:

<%= f.hidden_field :user, value: @user[0]['user_id']%>

为:

<%= f.hidden_field :user_id, value: @user[0]['user_id']%>

并在您的控制器中:

params.require(:portfolio).permit(:user_id, :name, :balance)

答案 1 :(得分:0)

代码的问题在于期望用户对象的强参数。在数据库中是否有任何列,用户作为属性名称。如果在投资组合表中有一个名为user的列,那么您的代码应该可以正常工作。但是,我猜测投资组合是否与用户表有关联,那么投资组合必须在其表中具有属性application.js。因此,使用user_id作为名称而不是用户,并传递整数值。不要忘记在强参数中允许user_id