@Tarzan3154

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 自己紹介ページに写真投稿&いいね機能

解決したいこと

Railsで自己紹介ページに写真投稿&いいねができる機能を付け、共有できるサービスを作成しておりました。ユーザ詳細ページの一部分にSKILL(自分の得意としていることや勉強していることを入力するスペース。titleとdescriptionを用意)部分を設け、ユーザ詳細変更画面で編集できるようにしていたのですが、show.html.erbにてskill部分を実装後、下記の通り不具合が出るのですが、原因をご教示お願いできないでしょうか?

①SKILLを入力(編集)しても、ユーザ詳細画面で何も表示されない。

②ユーザ詳細画面の「プロフィール変更」が、ログイン中以外のユーザでも表示されてしまう。

発生している問題・エラー

①②ともエラー画面等は現時点では表示されず、①についてはプロフィール部分は表示されるが、SKILL部分は入力しても何も表示されない。(ちなみにユーザ詳細変更画面で、プロフィール部分・SKILL部分の「更新」ボタンが2つあるが、どちらを押してもプロフィール部分のみしか更新されない)
スクリーンショット 2020-12-29 214421.png
スクリーンショット 2020-12-29 214754.png

該当するソースコード

routes.rb

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 :users, only: [:new, :create]

  resources :tasks
end
users_controller.rb

class UsersController < ApplicationController
  before_action :require_user_logged_in, only: [:index, :show]
  before_action :correct_user, only: [:edit]

  def index
    @users = User.order(id: :desc).page(params[:page]).per(50)
  end

  def show
    @user = User.find(params[:id])
    @skills = @user.skills.page(params[:page])
  end

  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)

    if @user.save
      flash[:success] = 'ユーザを登録しました。'
      redirect_to @user
    else
      flash.now[:danger] = 'ユーザの登録に失敗しました。'
      render :new
    end
  end

  def edit
    @user = User.find(params[:id])
  end

  def update
    @user = User.find(params[:id])

    if @user.update(user_params)
      flash[:success] = 'プロフィールを変更しました。'
      redirect_to @user
    else
      flash.now[:danger] = 'プロフィールが変更できませんでした。'
      render :edit
    end
  end

  private

  def user_params
    params.require(:user).permit(:name, :email, :password, :password_confirmation, :profession, :first_name, :last_name, :profile,)
  end

  def correct_user
  end
end
skills_controller.rb

class SkillsController < ApplicationController
  before_action :require_user_logged_in
  before_action :correct_user, only: [:edit, :show, :update, :destroy]

  def create
    @skills = current_user.skills.build(skill_params)
    if @skill.save
      flash[:success] = "Skill を登録しました。"
      redirect_to root_url
    else
      @skills = current_user.feed_skills.order(id: :desc).page(params[:page])
      flash.now[:danger] = "Skill の登録に失敗しました。"
      render "users/edit"
    end
  end

  def edit
    @skill = Skill.find(params[:id])
  end

  def update
    @skill = Skill.find(params[:id])

    if @skill.update(skill_params)
      flash[:success] = 'Skill は正常に更新されました'
      redirect_to @skill
    else
      flash.now[:danger] = 'Skill は更新されませんでした'
      render :edit
    end
  end

  def destroy
    @skill.destroy
    flash[:success] = "スキルを削除しました。"
    redirect_back(fallback_location: root_path)
  end

  private

  # Strong Parameter
  def skill_params
    params.require(:skill).permit(:title, :description)
  end

  def correct_user
    @skill = current_user.skills.find_by(id: params[:id])
    unless @skill
      redirect_to root_url
    end
  end
end
show.html.erb

<div class="row">
  <aside class="col-sm-12">
    <div class="text-left">
      <%= link_to 'プロフィール変更', edit_user_path(current_user.id) %>
    </div>
  </aside>

  <aside class="col-sm-12">
    <table class="table table-bordered">
      <tr>
        <th>職業</th>
        <td><%= @user.profession %></td>
      </tr>
      <tr>
        <th>名前</th>
        <td><%= @user.last_name %> <%= @user.first_name %></td>
      </tr>
      <tr>
        <th>自己紹介</th>
        <td><%= @user.profile %></td>
      </tr>
    </table>
  </aside>
  <%= render "skills/skills",skills:@skills %>
</div>
users/edit.html.erb

<div class="text-center">
  <h1>プロフィール変更画面</h1>
</div>

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

    <%= form_with(model: @user, local: true, method: :put) do |f| %>
      <%= render 'layouts/error_messages', model: f.object %>

      <div class="form-group">
        <%= f.label :profession, 'Profession' %>
        <%= f.text_field :profession, class: 'form-control' %>
      </div>

      <div class="form-group">
        <%= f.label :first_name, 'First Name' %>
        <%= f.text_field :first_name, class: 'form-control' %>
      </div>

      <div class="form-group">
        <%= f.label :last_name, 'Last Name' %>
        <%= f.text_field :last_name, class: 'form-control' %>
      </div>

      <div class="form-group">
        <%= f.label :profile, 'Profile' %>
        <%= f.text_field :profile, class: 'form-control' %>
      </div>

    <div class="text-left">
      <h3>Security</h3>
    </div>

      <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 '更新', class: 'btn btn-primary btn-block' %>

    <div class="text-left">
      <h3>SKILL</h3>
    </div>

      <%= render 'skills/edit', skills: @skill %>
    <% end %>
  </div>
</div>
skill/_edit.html.erb

<%= form_with(model: @user, local: true, method: :put) do |f| %>
  <%= render 'layouts/error_messages', model: f.object %>

  <div class="form-group">
    <%= f.label :title, 'Skill Title' %>
    <%= f.text_field :title, class: 'form-control' %>
  </div>

  <div class="form-group">
    <%= f.label :description, 'Skill Descriotion' %>
    <%= f.text_field :description, class: 'form-control' %>
  </div>

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

自分で試したこと

①については、skill/edit.html.erbのformの部分、@user@skillに修正したりしましたが、NoMethodError in Users#editが表示されてしまい、うまくいきません。
②については、show.html.erbの<%= link
to 'プロフィール変更'~の部分に<%= current_user == user %>~<% end %>を設定してみても、SyntaxError in UsersController#showが表示されてしまい、???です。

0 likes

Your answer might help someone💌