2016-09-29 5 views
0

Я боролся в течение нескольких дней, чтобы получить данные для сохранения вложенной формы. В основном я хочу иметь возможность хранить причины пользователей для отмены проекта, а также последний этап проекта до его отмены. Но я просто не могу получить действия cancel, cancel_save и cancel_params, чтобы играть красиво!Rails params для вложенных форм

Контроллер

before_action :correct_user, only: [:show, :edit, :update, :destroy, :cancel, :cancel_save] 

... 

def cancel 
    @project.build_project_close_reason 
end 

def cancel_save 
    @project.build_project_close_reason(cancel_params) 
    @project.update(project_status_id: 10) 
    redirect_to root_path, notice: 'Project has been successfully cancelled.' 
end 

private 

def correct_user 
    @user = current_user 
    @project = current_user.projects.find_by(id: params[:id]) 
    end 
    redirect_to user_projects_path, notice: "You are not authorised to view this project" if @project.nil? 
end 

def cancel_params 
    params.require(:project).permit(project_close_reason_attributes: [:comment]).merge(project_close_reason_attributes: [project_id: @project.id, last_status_id: @project.project_status_id ]) 
end 

Модели

class Project < ApplicationRecord 
    belongs_to :user 
    has_one :project_close_reason 
    accepts_nested_attributes_for :project_close_reason #adding this seemed to make no difference? 
end 

class ProjectCloseReason < ApplicationRecord 
    belongs_to :project 
end 

class User < ApplicationRecord 
... # All standard devise stuff 
    has_many :projects 
end 

Уплотненный формы в представлении

<%= form_for([@user, @project], url: {action: "cancel_save"}, method: :post) do |f| %> 

<%= fields_for :project_close_reason do |pcr| %> 

    <div class="field entry_box"> 
    <%= pcr.label "Why are you cancelling this project? (This helps us improve!)" %> 
    <%= pcr.text_area :comment, class: "form-control entry_field_text" %> 
    </div> 


<% end %> 

    <div class="actions center space_big"> 
    <%= f.submit "Cancel Project", class: "btn btn-lg btn-warning" %> 
    </div> 

<% end %> 

Маршруты

devise_for :users 
devise_for :admins 

resources :users do 
    resources :projects do 
    get "cancel", :on => :member 
    post "cancel" => 'projects#cancel_save', :on => :member 
    end 
end 

Это ошибка я получаю, когда я пытаюсь отправить форму:

ActionController::ParameterMissing in ProjectsController#cancel_save param is missing or the value is empty: project. Он ссылается на действие cancel_params

Спасибо за помощь!

UPDATE

Вот бревно, когда я звоню cancel_save

Started POST "https://stackoverflow.com/users/2/projects/10/cancel" for ::1 at 2016-09-29 10:03:44 +0200 
Processing by ProjectsController#cancel_save as HTML 
Parameters: {"utf8"=>"✓", "authenticity_token"=>"h6K+VFyjW/dV189YOePWZm+Pmjey50xAMQIJb+c3dzpEaMv8Ckh3jQGOWfVdlfVH/FxolbB45fXvTO0cdplhkg==", "project_close_reason"=>{"comment"=>"b"}, "commit"=>"Cancel Project", "user_id"=>"2", "id"=>"10"} 
User Load (11.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2 [["id", 2], ["LIMIT", 1]] 
Project Load (0.7ms) SELECT "projects".* FROM "projects" WHERE "projects"."user_id" = $1 AND "projects"."id" = $2 LIMIT $3 [["user_id", 2], ["id", 10], ["LIMIT", 1]] 
ProjectCloseReason Load (0.2ms) SELECT "project_close_reasons".* FROM "project_close_reasons" WHERE "project_close_reasons"."project_id" = $1 LIMIT $2 [["project_id", 10], ["LIMIT", 1]] 
Completed 400 Bad Request in 22ms (ActiveRecord: 12.1ms) 


ActionController::ParameterMissing (param is missing or the value is empty: project): 

ответ

0

В конце концов, я получил его для работы, не требуя проектов вообще. Это мой пересмотренный cancel_params в моем projects_controller. Для всех, кто смотрит на такую ​​аддитивную базу данных, я настоятельно рекомендую пропустить параметры для вложенной формы, если вы можете это сделать. Настолько проще!

private 

def cancel_params 
    params.require(:project_close_reason).permit(:comment).merge(project_id: @project.id, last_status_id: @project.project_status_id) 
end 
0

ошибка говорит, что нет PARAMS с именем project, который вы пытаетесь требовать в params.require(:project) линии в cancel params. Я думаю, что это происходит, потому что в form_for вы упомянули [@user, @project], то есть user's project. Итак, project params must be inside user's. Проверьте свой журнал, когда звоните cancel_save. Должно быть что-то вроде {user => {project => { } }.

+0

Я обновил приведенное выше, чтобы включить журнал при запуске действия «cancel_save». Странно, поскольку у меня есть стандартное действие 'project_params', которое выглядит довольно похоже (в том числе' .require (: project) ', который работает с другими действиями RESTful? – Stephen

+0

И это параметры, когда я запускаю« новое »действие для проектов , который работает с использованием 'project_params'. Параметры: {" utf8 "=>" ✓ "," authenticity_token "=>" Wg7ZMcOfhFxXyaHcN67phcuG27eKWGt + QpF + p3wnXGSZxKyZlXSoJgOQN3FT2MqkWFUpFYjHwsuc35rU7YlKzA == "," project "=> {" project_type_id "=>" 1 " , «name» => «Project 6 - это просто тестовое имя», «description» => «Это описание теста», «industry_id» => «1», «feature_ids» => [""], «addon_ids» => [""], "budget_id" => "1"}, "commit" => "Save Project", "user_id" => "2"} – Stephen

+0

Спасибо, я настолько расстроен гнездом боюсь, я просто работал вокруг него. Написал новый ответ, где я избавился: проект все вместе. Спасибо! – Stephen