Rails Params, возвращающие нулевое значение. Я не могу передать значение через контроллер или форму? - PullRequest
0 голосов
/ 07 мая 2018

Я попробовал несколько методов и проверил все существующие вопросы SO, которые я могу найти и не могу найти ответ на проблему. Я новичок в Rails.

У меня есть эти модели:

  1. Project (has_many WeeklyReflections, has_many ProjectTasks)
  2. WeeklyReflection (принадлежит проекту)
  3. ProjectTask (принадлежит_Проекту)
  4. Стандартная пользовательская модель устройства

Страница показа моего проекта отображает список задач проекта за неделю. Использование simplecalendar.

Я могу переходить вперед и назад на неделю за раз, после чего URL-адрес изменяется с www.site.com/projects/3 на www.site.com/projects/3?start_date=2108-05-30 или www.site.com/projects/3?start_date=2108-05-13, и это показывает все задачи, связанные с этой неделей.

Что я хочу сделать, так это создать для каждой страницы еженедельную запись в журнале, только одну из которых можно создать за неделю, однако у меня возникают проблемы с ее сохранением на контроллере - я пробовал несколько способов, а также пытался поместить его в виде скрытого поля в форме, но все еще не может заставить его работать.

Я поместил start_date: <%= render inline: params[:start_date].inspect %> и на страницу показа проекта, и в форме он возвращает значение правильно, т.е. "start_date:" 2018-04-28 "" или возвращает ноль, если на странице показа по умолчанию, которая следовало ожидать.

Два метода, которые я попробовал: - получить доступ к параметру start_date через контроллер (в контроллере ниже), а также добавить в форму следующее:

<%= hidden_field_tag(:weekending, params[:start_date]) %> (я также пытался использовать .to_date, так как я думаю, что возвращаемая строка не в правильном формате)

Однако оба метода возвращают нулевое значение, когда параметр start_date возвращает 2018-04-28 на странице просмотра.

Журнал консоли после действия создания:

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

Страница проекта:

 <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, показанная на странице показа проекта:

  <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>

Код заявления приложения:

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

=> Схема еженедельного отражения:

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

Ответы [ 2 ]

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

Это сработало. Большое спасибо.

С небольшим изменением на:

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

Я также должен был добавить:

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

Так, чтобы я мог зафиксировать начало недели даты в параметре.

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

Я думаю, это должно работать:

Добавить в свой ProjectController шоу действие:

  @weekly_reflection= @project.weekly_reflections.new

Изменение в 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

Изменение в форме WeeklyReflection:

<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>

Здесь мы создаем переменную @weekly_reflection внутри действия show ProjectsController и просто используем ее в форме

...