Olliedee
Olliedee

Reputation: 89

Rails Params returning a nil value. I can't pass in value via controller or form?

I have tried a few methods and checked all of the existing SO questions I can find and can't find an answer to the problem. I'm a Rails newbie.

I have these models:

  1. Project (has_many WeeklyReflections, has_many ProjectTasks)
  2. WeeklyReflection (belongs_to Project)
  3. ProjectTask (belongs_to Project)
  4. Standard devise user model

My Project show page displays a list of ProjectTasks for the week. Using simplecalendar.

I can navigate forward and back a week at a time, which then changes the URL from www.site.com/projects/3 to www.site.com/projects/3?start_date=2108-05-30, or www.site.com/projects/3?start_date=2108-05-13, and this then shows all the tasks related to that week.

What I want to do as well, is for each page create a weekly journal entry, only one of which can be created for the week, however, I'm having problems saving it to my controller - I've tried a few ways and also tried putting it in as a hidden field on a form, and still can't get it to work.

I've put start_date:<%= render inline: params[:start_date].inspect %> on both the Project show page and form it returns a value correctly, i.e. "start_date:"2018-04-28"" or it returns nil if on the default show page which is to be expected.

The two methods I've tried: are - accessing the start_date param via the controller (in the controller below) and also adding the following to the form:

<%= hidden_field_tag(:weekending, params[:start_date]) %> (I've also tried using .to_date, as I think the string it returns isn't in the right format)

However, both methods are returning a nil value when the start_date param is returning 2018-04-28 on the view page.

Console log after create action:

Started POST "/projects/6/weekly_reflections" for 2.96.199.78 at 2018-05-07 16:20:14 +0000
Cannot render console from 2.96.199.78! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
Processing by WeeklyReflectionsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"UFCXjIp1SZrql2JckHk1HrzDlzO2/WLVwcdvdh+FQKbdrVMfdaivtjS32oLaFwcFs0UcupVP+XV6VVnNwrM0XQ==", "week_reflection"=>{"reflectionentry"=>"adasda", "motivationscore"=>"1", "beliefscore"=>"1"}, "weekending"=>"2018-04-28", "commit"=>"Create Project reflection", "project_id"=>"6"}
  Project Load (0.6ms)  SELECT  "projects".* FROM "projects" WHERE "projects"."id" = ? LIMIT ?  [["id", 6], ["LIMIT", 1]]
   (0.1ms)  begin transaction
   (0.1ms)  commit transaction
  User Load (0.4ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ?  [["id", 2], ["LIMIT", 1]]
  User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 2], ["LIMIT", 1]]
   (0.1ms)  begin transaction
  SQL (1.3ms)  INSERT INTO "week_reflections" ("reflectionentry", "user_id", "project_id", "motivationscore", "beliefscore", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?)  [["reflectionentry", "adasda"], ["user_id", 2], ["project_id", 6], ["motivationscore", 1], ["beliefscore", 1], ["created_at", "2018-05-07 16:20:14.957131"], ["updated_at", "2018-05-07 16:20:14.957131"]]
   (15.0ms)  commit transaction

-

class WeeklyReflectionsController < ApplicationController
  before_action :set_weekly_reflection, only: [:show, :edit, :update, :destroy]
  before_action :set_project, only: [:new, :edit, :create, :show]

  def index
    @weekly_reflections= WeeklyReflection.all
  end

  def new
    @weekly_reflection= WeeklyReflection.new
  end

  def create
    @weekly_reflection= @project.weekly_reflections.create(project_reflection_params)
    @weekly_reflection.user = current_user
    @weekly_reflection.weekending = params[:start_date].to_date || Date.today.beginning_of_week     

    respond_to do |format|
      if @weekly_reflections.save
        format.html { redirect_to @weekly_reflection.project, notice: 'Weekly reflection was successfully created.' }
      else
        format.html { redirect_to @weekly_reflection.project, notice: 'Weekly reflection could not be added.' }
      end
    end
  end    

 private
    def weekly_reflection
      @weekly_reflection= WeeklyReflection.find(params[:id])
    end 

    def set_project
      @project = Project.find(params[:project_id])
    end

    def weekly_reflection_params
      params.require(:weekly_reflection).permit(:reflectionentry, :weekending, :motivationscore, :beliefscore)
    end
end

Project show page:

 <p id="notice"><%= notice %></p>
    start_date:<%= render inline: params[:start_date].inspect %> 
    <div class="row well">
      <div class="col-md-12">
        <%= render 'project_detail' %>
      </div>

      <div class="col-md-12">
        <% if @project.user == current_user && @project.active? %>
        <br>
          <%= render "project_tasks/task_modal" %>
        <% end %>
      </div>  


      <div class="col-md-12">      
        <%= render "project_reflection_calendar" %>
        <% if @project.user == current_user && @project.active? %>
        <h3>Add your thoughts for this week</h3>
        <%= render "project_reflections/form_reflection" %>
        <% end %>
    </div

WeeklyEntry form, shown on the project show page:

  <div class="row">
      start_date:<%= render inline: params[:start_date].inspect %>    
     <%= form_for([@project, @project.weekly_reflections.build]) do |form| %>       
        <div class="col-md-12 projectform">
            <%= form.label "Add your thoughts for this week" %>
            <%= form.text_field :reflectionentry, :rows =>2, style: 'width:100%;' %>
        </div>

    <div class="col-md-7 projectform">
      <%= form.label "How motivated are you for your project this week?" %>
      <%= form.select :motivationscore, [1,2,3,4,5,6,7,8,9,10], class:"form-control" %>
    </div>

    <div class="col-md-7 projectform">
      <%= form.label "How strongly do you believe you will reach your project?" %>
      <%= form.select :beliefscore, [1,2,3,4,5,6,7,8,9,10], class:"form-control" %>
    </div>


    <%= hidden_field_tag(:weekending, params[:start_date].to_date) %>


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

ApplicationRecord code:

class WeeklyReflection < ApplicationRecord
  belongs_to :project
  belongs_to :user    

  validates :reflectionentry, presence:true, length: {minimum:3, maximum: 540}
#required for simple_calendar
  def start_time
    self.weekending
  end      
end

class Project < ApplicationRecord
  has_many :project_tasks, dependent: :destroy
  belongs_to :user      
  has_many :weekly_reflections, dependent: :destroy
end

=> WeeklyReflection Schema:

(id: integer, reflectionentry: text, user_id: integer, project_id: integer, weekending: date, motivationscore: integer, beliefscore: integer, created_at: datetime, updated_at: datetime)

Upvotes: 1

Views: 1173

Answers (2)

Olliedee
Olliedee

Reputation: 89

That worked. Thanks so much.

With just a slight change to:

<%= form_for([@weekly_reflection.project, @weekly_reflection]) do |form| %>

I also had to add in:

<%= form.hidden_field :weekending, value: params[:start_date].try(:to_date).try(:beginning_of_week) || Date.today.beginning_of_week %>

So that I could capture the beginning of the week of the date in the param.

Upvotes: 0

Vasilisa
Vasilisa

Reputation: 4640

I think, this should work:

Add to your ProjectController show action:

  @weekly_reflection= @project.weekly_reflections.new

Change in WeeklyReflectionsController:

def create
  @weekly_reflection = @project.weekly_reflections.new(weekly_reflection_params)
  @weekly_reflection.user = current_user


  respond_to do |format|
    if @weekly_reflections.save
      format.html { redirect_to @weekly_reflection.project, notice: 'Weekly reflection was successfully created.' }
    else
      format.html { redirect_to @weekly_reflection.project, notice: 'Weekly reflection could not be added.' }
    end
  end
end    

private

def weekly_reflection_params
  params.require(:weekly_reflection).permit(:reflectionentry, :weekending, :motivationscore, :beliefscore)
end

Change in WeeklyReflection form:

<div class="row">   
  <%= form_for @weekly_reflection do |form| %>       
    <div class="col-md-12 projectform">
      <%= form.label "Add your thoughts for this week" %>
      <%= form.text_field :reflectionentry, :rows =>2, style: 'width:100%;' %>
    </div>

    <div class="col-md-7 projectform">
      <%= form.label "How motivated are you for your project this week?" %>
      <%= form.select :motivationscore, [1,2,3,4,5,6,7,8,9,10], class:"form-control" %>
    </div>

    <div class="col-md-7 projectform">
      <%= form.label "How strongly do you believe you will reach your project?" %>
      <%= form.select :beliefscore, [1,2,3,4,5,6,7,8,9,10], class:"form-control" %>
    </div>

    <%= form.hidden_field :weekending, value: params[:start_date] || Date.today.beginning_of_week %>

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

Here we create @weekly_reflection variable inside the show action of ProjectsController, and just use it in form

Upvotes: 1

Related Questions