【问题标题】:param is missing or the value is empty- Adding fields to existing model?参数丢失或值为空 - 将字段添加到现有模型?
【发布时间】:2018-05-30 17:50:50
【问题描述】:

我有一个具有许多属性的目标模型。

一旦一个目标完成,它会在按下按钮时被标记为完成,然后重定向到一个新表单,该表单可以为目标模型添加额外的属性。

对我来说,将它们存储在目标模型中是有意义的,因为它们只与目标相关联,但是,我无法让它正常工作,因为我总是得到参数丢失或值为空:目标。

目标参数用作标准 CRUD 参数。

goal_review_params 在目标完成后使用。

这是否可以在“更新”操作之外进行?

控制器:

class GoalsController < ApplicationController
  before_action :authenticate_user!, except: [:index, :show, :completedgoals]
  before_action :set_goal, only: [:show, :edit, :update, :destroy, :mark_completed, :goal_completed ]

 def goal_completed
    @authorize
    if @goal.update(goal_review_params)
        format.html { redirect_to @goal, notice: 'Goal review was successfully updated.' }
        format.json { render :show, status: :ok, location: @goal }
      else
        format.html { redirect_to goal_completed_goal_path(@goal) }
        format.json { render json: @goal.errors, status: :unprocessable_entity }
      end
  end



private
    def set_goal
      @goal = Goal.find(params[:id])
    end

#category_ids:[] needs to be added back to goal_params when they're added back in
    def goal_params
      params.require(:goal).permit(:goalname, :goaldesc, :goalhow, :goalwhy, :goalreward, :goalduedate, :goalstatus )
    end

    def goal_review_params
      params.require(:goal).permit(:goaldifficult, :goallearned, :goalnext)
    end

查看:

 <%= form_for (@goal) do |form| %>
<div class="col-md-12 goalform">
    <%= form.label :goaldifficult, value: "Name your Goal" %><br>
    <%= form.text_field :goaldifficult, :rows => 2, style: 'width:80%;', 
    placeholder: "...'" %>
</div>

<div class="col-md-12 goalform">
    <%= form.label :goallearned, value: "Name your Goal" %><br>
    <%= form.text_field :goallearned, :rows => 2, style: 'width:80%;', 
    placeholder: "...'" %>
</div>

<div class="col-md-12 goalform">
    <%= form.label :goalnext, value: "Name your Goal" %><br>
    <%= form.text_field :goalnext, :rows => 2, style: 'width:80%;', 
    placeholder: "...'" %>
</div>

<div class="col-md-12 goalform">
    <%= form.submit class:"btn btn-primary" %>
</div>

路线:

 resources :goals do
    ...
    member do
      get 'goal_completed', to: 'goals#goal_completed', as: 'goal_completed'

【问题讨论】:

  • 您可以在执行您提到的createupdate 操作后转储控制台日志(使用params)吗?
  • 这听起来像是 StrongParameters 的问题以及您的表单发布的任何内容。您能否提供有关 GoalsController#goals_completed 操作的完整 Rails 日志?

标签: ruby-on-rails ruby forms parameters


【解决方案1】:

您有param is missing or the value is empty: goal 错误,因为您的goal_review_params 确实丢失了。

当您将创建/更新的目标重定向到“goal_completed”视图表单时,您正在执行“获取”请求。正如您在路由中定义的那样,请求将读取控制器内的命名方法并在此行停止:

if @goal.update(goal_review_params)

在请求的这一点上,所有goal_review_params 都丢失了,因为您有这样的 GET:

开始 GET "/goals/4/goal_completed" for ...
由GoalsController#goal_completed 处理为 HTML
参数:{"id"=>"4"}

要实现您想要的,您可以创建两条自定义路由,一条用于“GET”,一条用于“PATCH”,或者如果您真的只想要一个操作,请像这样处理多个请求:

resources :goals do
  member do
    get 'goal_completed'  #<== to get the view form
    patch 'goal_completed' #<== to handle the update fields
  end
end

在您的控制器中:

def goal_completed
  if request.patch?
    respond_to do |format|
      if @goal.update(goal_review_params)
        format.html { redirect_to @goal, notice: 'Goal review was successfully updated.' }
        format.json { render :show, status: :ok, location: @goal }
      else
        format.html { redirect_to goal_completed_goal_path(@goal) }
        format.json { render json: @goal.errors, status: :unprocessable_entity }
      end
    end
  end
end

并在您的视图表单中指定提交的自定义路径以防止基本的“更新”操作:

<%= form_for @goal, url: goal_completed_goal_path(@goal) do |form| %>
  # the form
<% end %>

【讨论】:

    【解决方案2】:

    您仍在使用更新方法。

    要点击其他方法,请关注form_for but to post to a different action

    form_for @goal, :url => url_for(:controller => 'goal', :action => 'goal_completed')

    【讨论】:

    • 可能想要添加 method: :get 给定已发布的路由或建议更改路由动词
    • 谢谢@Mark。我已将其更改为以下内容:&lt;%= form_for @goal, :url =&gt; url_for(:controller =&gt; 'goal', :action =&gt; 'goal_completed') do |form| %&gt; 但仍然出现相同的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多