Question: I am having problems with my views displaying my model

Question

I am having problems with my views displaying my model

Answers 1
Added at 2016-12-23 04:12
Tags
Question

in this application, clients can have many projects and projects can only have one client.

I keep getting this error when I try accessing projects/new:

ActionController::ParameterMissing in ProjectsController#new

param is missing or the value is empty: project

this is the line that is highlighted in my project controller:

params.require(:project).permit(:client_id, :project_description, :project_timescale)

this is my client model:

class Client < ActiveRecord::Base
has_many :projects, dependent: :destroy
validates :name, presence: true
end

this is my project model:

class Project < ActiveRecord::Base
belongs_to :client
validates :project_description, :client, presence: true
end

these are my migration for the client

class CreateClients < ActiveRecord::Migration
def change
create_table :clients do |t|
  t.string :name, presence: true, null: false

  t.timestamps null: false
 end
end
end

migration for the projects:

class CreateProjects < ActiveRecord::Migration
def change
create_table :projects do |t|
  t.belongs_to :client, index: true, foreign_key: true, null: false
  t.text :project_description, null: false, presence: true
  t.string :project_timescale

  t.timestamps null: false
end
end
end

the controller for the client:

class ClientsController < ApplicationController
before_action :set_client, only: [:show, :edit, :update, :destroy]

# GET /clients
# GET /clients.json
def index
@clients = Client.all
end

# GET /clients/1
# GET /clients/1.json
def show
end

# GET /clients/new
def new
@client = Client.new
end

# GET /clients/1/edit
def edit
end

# POST /clients
# POST /clients.json
def create
@client = Client.new(client_params)

respond_to do |format|
  if @client.save
    format.html { redirect_to @client, notice: 'Client was successfully     created.' }
    format.json { render :show, status: :created, location: @client }
  else
    format.html { render :new }
    format.json { render json: @client.errors, status: :unprocessable_entity }
  end
  end
  end

  # PATCH/PUT /clients/1
  # PATCH/PUT /clients/1.json
  def update
  respond_to do |format|
  if @client.update(client_params)
    format.html { redirect_to @client, notice: 'Client was successfully updated.' }
    format.json { render :show, status: :ok, location: @client }
    else
    format.html { render :edit }
    format.json { render json: @client.errors, status: :unprocessable_entity }
    end
    end
    end

   # DELETE /clients/1
   # DELETE /clients/1.json
   def destroy
   @client.destroy
   respond_to do |format|
   format.html { redirect_to clients_url, notice: 'Client was successfully destroyed.' }
   format.json { head :no_content }
   end
   end

   private
   # Use callbacks to share common setup or constraints between actions.
   def set_client
   @client = Client.find(params[:id])
   end

   # Never trust parameters from the scary internet, only allow the white list through.
   def client_params
   params.require(:client).permit(:name)
   end
   end

controller for the project:

    class ProjectsController < ApplicationController
    before_action :set_project, only: [:new, :create]

    # GET /projects
     # GET /projects.json
  def index
    @projects = Project.all
  end

  # GET /projects/1
  # GET /projects/1.json
  def show
  end

  # GET /projects/new
  def new
    @project = @client.projects.new
  end

  # GET /projects/1/edit
  def edit
  end

  # POST /projects
  # POST /projects.json
  def create
    @project = @client.projects.new(project_params)

    respond_to do |format|
      if @project.save
        format.html { redirect_to @project, notice: 'Project was successfully created.' }
        format.json { render :show, status: :created, location: @project }
      else
        format.html { render :new }
        format.json { render json: @project.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /projects/1
  # PATCH/PUT /projects/1.json
  def update
    respond_to do |format|
      if @project.update(project_params)
        format.html { redirect_to @project, notice: 'Project was successfully updated.' }
        format.json { render :show, status: :ok, location: @project }
      else
        format.html { render :edit }
        format.json { render json: @project.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /projects/1
  # DELETE /projects/1.json
  def destroy
    @project.destroy
    respond_to do |format|
      format.html { redirect_to projects_url, notice: 'Project was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_project
      @project = Client.find_by(id: params[:client_id]) || Client.find(project_params[:client_id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def project_params
       params.require(:project).permit(:client_id, :project_description, :project_timescale)
    end
end

this is the view for projects (new.html.haml)

%h1 New project

= render 'form'

= link_to 'Back', 

this is the form code, still for projects (form.html.haml)

= form_for @project do |f|
  - if @project.errors.any?
    #error_explanation
      %h2= "#{pluralize(@project.errors.count, "error")} prohibited this project from being saved:"
      %ul
        - @project.errors.full_messages.each do |msg|
          %li= msg

  .field
    = f.label :client
    = f.text_field :client
  .field
    = f.label :project_description
    = f.text_area :project_description
  .field
    = f.label :project_timescale
    = f.text_field :project_timescale
  .actions
    = f.submit 'Save'
Answers to

I am having problems with my views displaying my model

nr: #1 dodano: 2016-12-23 05:12

The problem here is no value in @client . Assuming you will receive params[:client_id] in the new action

I think you need to change the code link this:

before_action :set_client, only: [:new, :create]

...
# GET /projects/new
def new
    @project = @client.projects.new
end
...

private
def set_client
    @client = Client.find_by(id: params[:client_id]) || Client.find(project_params[:client_id])
end
Source Show
◀ Wstecz