2016-08-09 4 views
0

Я создаю простое приложение списка Todo в рельсах и у меня есть следующая проблема:Невозможно изменить корневые маршруты рельсов

У меня есть задача, которая belongs_to проект я создал шаблон - projects/show.html.erb И Я не могу установить его как root page моего приложения, как я вижу из отладчика - корень всегда projects#index action

PS Мне нужно показать, что корневая страница, потому что я не могу использовать эту форму в индексном действия контроллера

<%= form_for [@project, @task],remote: true do |f| %> 
      <%= f.input :body,class: 'form-control' %> 
      <%= f.submit 'Add task', class: 'btn' %> 
     <% end %> 

проекты

class ProjectsController < ApplicationController 
    before_action :load_project, only: [:show, :edit, :update, :destroy] 
    before_action :authenticate_user! 

    def index 
     @projects = current_user.projects unless current_user.nil? 
     end 

     def show 
     @task = @project.tasks.new 
     end 

     def new 
     @project = current_user.projects.new 
     end 

     def edit 
     end 

     def create 
     @project = current_user.projects.create(project_params) 

     if @project.save 
      redirect_to root_path 
     else 
      render :new 
     end 
     end 

     def update 
     if @project.update(project_params) 
      redirect_to @project 
     else 
      render :edit 
     end 
     end 

     def destroy 
     @project.destroy 
     redirect_to projects_path 
     end 

     private 

    def load_project 
     begin 
     @project = Project.find(params[:id]) #raises an exception if project not found 
     rescue ActiveRecord::RecordNotFound 
     redirect_to projects_path 
     end 
    end 

     def project_params 
     params.require(:project).permit(:name, :user_id) 
     end 

end 

routes.rb

Rails.application.routes.draw do 
    devise_for :users, :controllers => { :omniauth_callbacks => "callbacks" } 
    # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html 
    root 'projects#index' 


    resources :projects do 
    resources :tasks 
    end 




end 

И маршруты, генерируемые рейк-маршруты

todo$ rake routes 
          Prefix Verb  URI Pattern         Controller#Action 
       new_user_session GET  /users/sign_in(.:format)      devise/sessions#new 
        user_session POST  /users/sign_in(.:format)      devise/sessions#create 
      destroy_user_session DELETE /users/sign_out(.:format)      devise/sessions#destroy 
user_facebook_omniauth_authorize GET|POST /users/auth/facebook(.:format)     callbacks#passthru 
user_facebook_omniauth_callback GET|POST /users/auth/facebook/callback(.:format)  callbacks#facebook 
        user_password POST  /users/password(.:format)      devise/passwords#create 
       new_user_password GET  /users/password/new(.:format)     devise/passwords#new 
       edit_user_password GET  /users/password/edit(.:format)     devise/passwords#edit 
           PATCH /users/password(.:format)      devise/passwords#update 
           PUT  /users/password(.:format)      devise/passwords#update 
     cancel_user_registration GET  /users/cancel(.:format)      devise/registrations#cancel 
       user_registration POST  /users(.:format)        devise/registrations#create 
      new_user_registration GET  /users/sign_up(.:format)      devise/registrations#new 
      edit_user_registration GET  /users/edit(.:format)       devise/registrations#edit 
           PATCH /users(.:format)        devise/registrations#update 
           PUT  /users(.:format)        devise/registrations#update 
           DELETE /users(.:format)        devise/registrations#destroy 
          root GET /           home#index 
        project_tasks GET  /projects/:project_id/tasks(.:format)   tasks#index 
           POST  /projects/:project_id/tasks(.:format)   tasks#create 
       new_project_task GET  /projects/:project_id/tasks/new(.:format)  tasks#new 
       edit_project_task GET  /projects/:project_id/tasks/:id/edit(.:format) tasks#edit 
        project_task GET  /projects/:project_id/tasks/:id(.:format)  tasks#show 
           PATCH /projects/:project_id/tasks/:id(.:format)  tasks#update 
           PUT  /projects/:project_id/tasks/:id(.:format)  tasks#update 
           DELETE /projects/:project_id/tasks/:id(.:format)  tasks#destroy 
         projects GET  /projects(.:format)       projects#index 
           POST  /projects(.:format)       projects#create 
        new_project GET  /projects/new(.:format)      projects#new 
        edit_project GET  /projects/:id/edit(.:format)     projects#edit 
         project GET  /projects/:id(.:format)      projects#show 
           PATCH /projects/:id(.:format)      projects#update 
           PUT  /projects/:id(.:format)      projects#update 
           DELETE /projects/:id(.:format)      projects#destroy 
+0

Почему вы должны изменить корневой каталог? Вы хотите изменить корень _route_? Rails не является статическим сервером. Корневой каталог не влияет на то, какие файлы отображаются. В любом случае, если вы хотите, чтобы проекты отображали шаблон для отображения на '/', используйте этот маршрут: 'root 'projects # show'' однако ваш метод show требует параметра' project_id', который не будет автоматически предоставлен. –

+0

ну была опечатка в моих rutes.rb - я исправил it.but '/' все еще перенаправляет меня на проекты # index, где я получаю ошибку с этой формой (потому что я не могу использовать форму с такими параметрами в индексе действие.насколько я знаю) – Mikhah

ответ

1

Почему вы хотите, чтобы индекс отображался на странице? Ну, как ты можешь это сделать? Действие show требует, чтобы контроллер id был передан контроллеру, чтобы конкретный проект мог быть отображен пользователю. Как вы можете передать id, когда пользователь запрашивает /?

Это имеет смысл?

Я предлагаю вам оставить корень на странице index. В представлении индекса привяжите каждый проект к его странице показа. Необязательно иметь вложенную форму на индексной странице.

Или, если вы хотите перечислить все проекты и задачи на корневой странице, измените представление index, чтобы просмотреть все задачи проекта.

@projects.each do |project| 
    # display project's information 
    project.tasks.each do |task| 
    # display the task information 
    # display a new task button 
    end 
end 

Но вы не можете отобразить вложенную форму, как вы просили. Потому что форма требует @project и @task, которую вы не можете определить в index action. Возможно, вы можете добавить remote: true в «Новая задача», а затем запустить JS-ответ, чтобы отобразить форму в модальном режиме.

Если это звучит для вас в новинку, смотрите https://launchschool.com/blog/the-detailed-guide-on-how-ajax-works-with-ruby-on-rails

Это будет идти через вас с помощью AJAX в вашем приложении рельсы.

Надеюсь, это поможет!

+0

Приложение должно выглядеть как страница с проектом и его задачами, поэтому я не могу создавать ссылки на другие страницы. – Mikhah

+0

Вы хотите отобразить все проекты и их задачи на корневой странице? –

+0

Да, после входа пользователя - он должен взглянуть на все проекты со всеми своими задачами и иметь возможность добавлять задачи к проекту через форму – Mikhah

Смежные вопросы