параметр отсутствует или значение пусто. Добавление полей в существующую модель? - PullRequest
0 голосов
/ 30 мая 2018

У меня есть модель целей с множеством атрибутов.

Как только цель завершена, она отмечается как завершенная при нажатии кнопки, а затем перенаправляется в новую форму, которая может добавить дополнительные атрибуты к цели.модель.

Для меня имело смысл хранить их в целевой модели, так как они всегда связаны только с целью, однако я не могу заставить ее работать правильно, так как всегда получаю, что param отсутствует илизначение пустое: цель.

Параметры цели используются в качестве стандартных параметров CRUD.

Цель_представления_параметры используются после достижения цели.

Возможно ли это сделатьвне действия «обновление»?

Контроллер:

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'

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

У вас ошибка param is missing or the value is empty: goal, потому что ваши goal_review_params действительно отсутствуют.

Когда вы перенаправляете созданную / обновленную цель в форму представления "goal_completed", вы выполняете запрос "get".И как вы определили его в своих маршрутах, запрос будет читать именованный метод внутри контроллера и останавливаться на этой строке:

if @goal.update(goal_review_params)

в этой точке запроса все goal_review_params отсутствуют, потому чтоу вас есть GET вот так:

Запущено GET "/ goal / 4 / goal_completed" для ...
Обработка 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 %>
0 голосов
/ 30 мая 2018

Вы все еще используете метод обновления.

Чтобы воспользоваться другим методом, следуйте form_for, но чтобы публиковать в другом действии

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...