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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

1回答

1584閲覧

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

takyas

総合スコア54

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

1グッド

0クリップ

投稿2016/03/09 11:52

編集2016/03/09 14:17

ルーティング経由(?)のページ遷移と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も同様のルーティングです。

misa👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

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/09 14:18

編集2016/03/10 08:18
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takyas

2016/03/11 05:18

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問