質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.80%

rails4 ルーティングとhttpリクエストまわりに関しての質問です。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 942

takyas

score 54

 ルーティング経由(?)のページ遷移とhttpリクエストに直接入力した場合のページ遷移(?)では動きが違うというバグが出ています。

素人が故にどのような情報をこちらに記載すれば、閲覧者様の解決のお力になるのか理解していないので、追加で必要な情報がございましたら、ご教示いただけますと幸いです。
"?"が付いている表現には、表現が適切かどうが怪しいので"?"を付けています。

開発環境 
Ruby 2.3 
Rails 4.2.5

やりたいこと
UUserモデル、Skillモデル、UserSkillモデルがあり、UserのMyPage内でSkillの新規登録・編集・削除

ハマっているポイント(画像参照)
トップページにあるアバターイメージをクリックすると「マイページ」と「ログアウト」がtoggleで出てきます。
「マイページ」をクリックすると「マイページ」へ遷移するのですが、スキルリストの「更新」をクリックしても何もリアクションがありません。
binding.pryをどこに設置しても引っかかりません。
(リクエストが飛んでいない?)
しかしながら、トップページで直接httpを入力して、ページ遷移すると「更新」が出来ます。binding.pryも引っかかります。
「トップページ → マイページクリックしての遷移 → マイページ → リロード」でも「更新」出来ます。
top
mypage
http_direct

各要素(?)のコードは以下です。

application.html.erb

<ul class="dropdown-menu">
   <li><%=link_to 'マイページ', user_path(current_user) %></li>
   <li><%=link_to 'ログアウト', destroy_user_session_path, method: :delete %></li>
</ul>

users_controller.rb

class UsersController < ApplicationController
  before_action :set_user, only: [:show]

  def show
    @userskills = @user.user_skills
  end

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


show.html.erb

<!-- userの情報 省略 -->
<div id="user_skill">
  <%= render partial: "skill", locals: {user: @user} %>
</div>


users/_skill.html.erb

<table class="table table-striped">
    <thead>
        <tr>
            <th>No.</th>
            <th>スキル</th>
            <th>レベル</th>
            <th>詳細</th>
            <th>編集</th>
            <th>削除</th>
        </tr>
    </thead>
    <tbody>
      <% @userskills.each_with_index do |userskill, i| %>
        <tr class="skill_list_<%= i+1 %>">
          <%= form_for(userskill, url: user_skill_path(userskill), html: {method: :put}) do |f| %>
            <td><%= i %></td>
            <td><%= f.select :skill_id, { :html5 => "1", :css3 => "2"} %></td>
            <td><%= f.select :level, { :初心者 => "1", :経験者 => "2", :プロ => "3"} %></td>
            <td><%= f.text_area :detail %></td>
            <td>
              <%= f.submit "更新" %>
            </td>
            <td>
              <%= link_to '戻る', user_path(current_user.id) %>
            </td>
          <% end %>
        </tr>
      <% end %>
    </tbody>
</table>


user_skills_controller.rb

class UserSkillsController < ApplicationController
  before_action :set_skill, only: [:update]

  def update
    @params = userskill_params
    respond_to do |format|
      if @userskill.update(@params)
        format.html { redirect_to root_path, notice: 'UserSkill was successfully updated.' }
      end
    end
  end

  private

  def set_skill
    @userskill = UserSkill.find(params[:id])
  end

  def userskill_params
    params.require(:user_skill).permit(:id, :skill_id, :level, :detail)
  end
end


routes.rb

users         GET         /users(.:format)                      users#index
                  POST       /users(.:format)                       users#create
new_user  GET          /users/new(.:format)               users#new
edit_user  GET          /users/:id/edit(.:format)          users#edit
user           GET          /users/:id(.:format)                   users#show
                   PATCH    /users/:id(.:format)                   users#update
                   PUT         /users/:id(.:format)                   users#update
                   DELETE   /users/:id(.:format)                   users#destroy


 user_skillも同様のルーティングです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

routes.rbでルーティングがそれが全てであれば,userskillsコントローラーのupdateアクションへのルーティングが作られていません。
よって_skill.html.erbのuser_skill_pathも未定義でurlを指定出来てないようです。
わざと存在しないパスにリクエストするか,railsコマンドで確認するか,erbファイルにもbinding.pryは貼れるのいずれかで調べられるので定義されているか確認して下さい。

簡単に直すのであれば,

routes.rbに

PUT (_skill.html.erbからリクエストする任意のパス),:as => user, :to =>
skill_path user_skill#update

という記述を追加します。

ただ,rails g scafoldding

などのメソッドでモデルを追加した場合自動的にルーティングされるのでモデルを作るのに慣れたらそちらを使うのがいいと思います。

また指定するURLに何かデフォルト設定で困ることがなければroutes.rbでresourcesメソッドに該当モデルを指定して

resources: モデル名

と記述するとそのモデルに関するCRUDに必要なルーティングを自動で生成してくれます。

あるコントローラーのアクションをURL経由で呼び出すには必ずルーティングが必要になります。

またブラウザのURLバーからCRUDメソッドが呼び出せてしまうのがちょっと不可解です。普通はGETメソッドで更新が掛かるのはあり得ないのですが…。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/11 14:18

    tkow様
    度々のアドバイスありがとうございます!
    解決いたしました!!
    お忙しいところ度々のアドバイス本当にありがとうございましたm(_ _)m
    またハマった時には投稿しますので、その際は是非宜しくお願い致します!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る