Как разместить форму для создания новой записи на главной странице. RoR - PullRequest
0 голосов
/ 28 октября 2019

Я устанавливаю Ubuntu, RoR и все компоненты RoR. Затем я обновляю вопрос. Мне нужно получить форму, как на этом снимке экрана . Мне нужно это часть . Чтобы он появился после нажатия кнопки Add. Я понимаю логику добавления формы после нажатия кнопки, но не могу понять, как должен выглядеть код самой формы. Даже форма только с text_field запускает сайт с ошибкой 500. Я, возможно, многого не знаю, я просто изучаю RoR.

index.html.erb

<style type="text/css">
    p{
        font-family: Times New Roman
        }
</style>
<p>
<strong><h1><%= @title %></h1>
<br><br><br>
<% @projects.each do |project| %>
    <h2 style="text-transform: uppercase"><%= project.title %></h2>
    <ul>
    <% @todos.each do |todo| %>
        <% if todo.project_id == project.id %>
            <li><%= todo.text %></li>
        <% end %>
    <% end %>
    </ul>
<% end %>
<h2>Новая задача</h2>
<%= form_with(model: @todo, local: true) do |todo| %>
    <%= todo.text_field :text %>
    <%= todo.select (:project_id, option_for_select(project_array)) %>
    <%= todo.submit "Отмена"%>
    <%= todo.submit "ОК" %>
<% end %>
</strong>
</p>

projects_controller.rb

class ProjectsController < ApplicationController
  before_action :set_project, only: [:show, :edit, :update, :destroy]

  # 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 = Project.new
  end

  # GET /projects/1/edit
  def edit
  end

  # POST /projects
  # POST /projects.json
  def create
    @project = Project.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 = Project.find(params[:id])
    end

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

todos_controller.rb

class TodosController < ApplicationController
  before_action :set_todo, only: [:show, :edit, :update, :destroy]

  # GET /todos
  # GET /todos.json
  def index
    @todos = Todo.all
  end

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

  # GET /todos/new
  def new
    @todo = Todo.new
  end

  # GET /todos/1/edit
  def edit
  end

  # POST /todos
  # POST /todos.json
  def create
    @todo = Todo.new(todo_params)

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

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

  # DELETE /todos/1
  # DELETE /todos/1.json
  def destroy
    @todo.destroy
    respond_to do |format|
      format.html { redirect_to todos_url, notice: 'Todo was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

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

    # Never trust parameters from the scary internet, only allow the white list through.
    def todo_params
      params.require(:todo).permit(:text, :isCompleted, :project_id)
    end
end

todoshnik_controller.rb

class TodoshnikController < ApplicationController
    def index
        @title = 'Задачи'
        @projects = Project.all
        @todos = Todo.all
        @todo = Todo.new
        @project_array = @projects.map { |project| [project.title, project.id] }
    end

    def create

    end

    def update

    end
end

rout.rb

Rails.application.routes.draw do
  root 'todoshnik#index'
  resources :todos
  resources :projects
end

Gemfile

source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

ruby '2.6.5'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 6.0.0'
# Use postgresql as the database for Active Record
gem 'pg', '>= 0.18', '< 2.0'
# Use Puma as the app server
gem 'puma', '~> 3.11'
# Use SCSS for stylesheets
gem 'sass-rails', '~> 5'
# Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker
gem 'webpacker', '~> 4.0'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.7'
# Use Redis adapter to run Action Cable in production
# gem 'redis', '~> 4.0'
# Use Active Model has_secure_password
# gem 'bcrypt', '~> 3.1.7'

# Use Active Storage variant
# gem 'image_processing', '~> 1.2'

# Reduces boot times through caching; required in config/boot.rb
gem 'bootsnap', '>= 1.4.2', require: false

group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
end

group :development do
  # Access an interactive console on exception pages or by calling 'console' anywhere in the code.
  gem 'web-console', '>= 3.3.0'
end

group :test do
  # Adds support for Capybara system testing and selenium driver
  gem 'capybara', '>= 2.15'
  gem 'selenium-webdriver'
  # Easy installation and use of web drivers to run system tests with browsers
  gem 'webdrivers'
end

# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

Ответы [ 3 ]

2 голосов
/ 28 октября 2019

Добавление переменной экземпляра @todo в действие index

def index
 @title = 'Задачи'
 @projects = Project.all
 @todos = Todo.all
 @todo = Todo.new
 @project_array = @projects.map { |project| [project.title, project.id] } #minimize the use of logic in your views. 
end

Добавление формы в ваше представление.

<%= form_for @todo do |todo| %>
 <%= todo.text_field :text %>
 <%= todo.select :project_id, options_for_select(@project_array) %>
 <%= todo.submit "Отмена" %>
 <%= todo.submit "ОК" %>
<% end %>

Если у вас есть TodoController с действием создания и обновления

<%= form_with(model: @todo, local: true) do |todo| %>
 <%= todo.text_field :text %>
 <%= todo.select :project_id, options_for_select(@project_array) %>
 <%= todo.submit "ОК" %>
<% end %>

Это всегда будет указывать на действие создания TodoController

1 голос
/ 28 октября 2019

Проблема в @todo не указана в вашем index_controller.rb, поэтому ваше действие index_controller.rb #index должно быть:

def index
  @title = 'Задачи'
  @projects = Project.all
  @todos = Todo.all
  @todo = Todo.new
end

Тогда в вашем index.html.erb

<%= form_for @todo do |todo| %>
  <%= todo.text_field :text %>
  <%= project_array = @projects.map { |project| [project.title, project.id] } %>
  <%= todo.select (:project_id, option_for_select(project_array)) %>
  <%= todo.submit "Отмена" %>
  <%= todo.submit "ОК" %>
<% end %>
0 голосов
/ 28 октября 2019

попробуйте установить simple_form_for gem. Это позволит вам без проблем создавать форму.

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