tn-soccerball
@tn-soccerball

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

rails root画面がうまく設定できない

root to: "tasks#index"

としているのにトップページがログイン画面になってしまうんですが以下に必要なファイルコードを書くので一緒に解決していただけるとありがたいです。

.やったことtasks_controller内のbefore_action :require_user_logged_in
をなくしたらルーティング通りにトップページが表示されるのですが、ログイン機能をつけたいのでなくてはいけません。

config\roots
Rails.application.routes.draw do

  root to: "tasks#index"

  get 'login', to: 'sessions#new'
  post 'login', to: 'sessions#create'
  delete 'logout', to: 'sessions#destroy'

  get 'signup', to: 'users#new'

  resources :tasks

  resources :users, only: [:index, :show, :new, :create]
end
taks_controller


class TasksController < ApplicationController

    before_action :require_user_logged_in
    before_action :correct_user, only: [:destroy]


    def index
       @tasks = Task.all#.page(params[:page]).per(3)

    if logged_in?
      @task = current_user.tasks.build  # form_with 用
      @tasks = current_user.tasks.order(id: :desc).page(params[:page])
    end

    end

    def show
        @task = Task.find(params[:id])
    end

    def new
       @task = Task.new
    end
 .......
.......
sessins_controller

class SessionsController < ApplicationController
  def new
  end

  def create
    email = params[:session][:email].downcase
    password = params[:session][:password]
    if login(email, password)
      flash[:success] = 'ログインに成功しました。'
      redirect_to root_url
    else
      flash.now[:danger] = 'ログインに失敗しました。'
      render :new
    end
  end

  def destroy
     session[:user_id] = nil
    flash[:success] = 'ログアウトしました。'
    redirect_to root_url
  end

  private

  def login(email, password)
    @user = User.find_by(email: email)
    if @user && @user.authenticate(password)
      # ログイン成功
      session[:user_id] = @user.id
      return true
    else
      # ログイン失敗
      return false
    end
  end
end
sessions\new.html.erb

<h3>sessions#new</h3>

<div class="text-center">
  <h1>Log in</h1>
</div>

<div class="row">
  <div class="col-sm-6 offset-sm-3">

    <%= form_with(url: login_path, scope: :session, local: true) do |f| %>

      <div class="form-group">
        <%= f.label :email, 'Email' %>
        <%= f.email_field :email, class: 'form-control' %>
      </div>

      <div class="form-group">
        <%= f.label :password, 'Password' %>
        <%= f.password_field :password, class: 'form-control' %>
      </div>

      <%= f.submit 'Log in', class: 'btn btn-primary btn-block' %>
    <% end %>

    <p>New user? <%= link_to 'Sign up now!', signup_path %></p>
  </div>
</div>

よろしくお願いいたします。

0

1Answer

before_action :require_user_logged_inこれが未ログイン時はログインページにリダイレクトするような処理をすると思うので、正しい挙動だと思います
ログインした状態であれば/にアクセスすれえばtasks#indexが表示されるのではないでしょうか。

0Like

Comments

  1. @tn-soccerball

    Questioner

    仰る通りの挙動をするはずなんですが、直接/をURLに入力してlogin画面に入ってしまうんですよね...
  2. `task#index`はログインしなくても見れるようにしたいけど、他の画面はloginを必須にしたい、という感じでしょうか?

Your answer might help someone💌