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

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

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

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

971閲覧

rails_動的なroutes_urlの設定

ak_ruby

総合スコア1

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2022/10/26 09:46

編集2022/10/27 03:01

前提

Ruby初学者です。3か月ほど独学で学習している者です。
現在イベント管理ツールを開発中です。
deviceのログイン機能を利用しチームごとに管理できるアプリを開発中

共有URLでログインしていないユーザーも登録できるようにしましたが
URLの生成時にチームの名前をURLに取り入れたい状況です。

下記サイトを参考に動的なURLの実装を試みておりますが、実装できない状況です。
https://ac-creative-lab.net/way_to_develop_routing_with_dynamic_path/

参考サイト通りに調整しましたが、エラーが表示される状況です。

ActionController::UrlGenerationError (No route matches {:action=>"index", :controller=>"schedules"}, missing required keys: [:teamcores_teamname]):

ご回答のほどよろしくお願い致します

実現したいこと

teamcore.rb(モデル)にある値をURLに表示させたい。

発生している問題・エラーメッセージ

ActionController::UrlGenerationError (No route matches {:action=>"index", :controller=>"schedules"}, missing required keys: [:teamcores_teamname]):

該当のソースコード

routes.rb

Rails.application.routes.draw do get 'kiyaku/index' get 'top', to: 'home#top', as: :top root to:'home#index' namespace :admin do resources :users end #root 'schedules#show' # get "/" => "schedules#index" get 'login', to: 'home#index' resources :team resources :answers scope '/:teamcore_teamname' do resources :schedules, only: [:index, :show, :new, :create, :destroy] end #resources :schedules resources :kiyaku # registrations_controller.rbを有効にします。 devise_for :users, controllers: { registrations: 'users/registrations' } devise_scope :user do post 'users/sign_up/confirm', to: 'users/registrations#confirm' get 'users/sign_up/email_notice', to: 'users/registrations#email_notice' get 'users/sign_up/complete', to: 'users/registrations#complete' end # お問い合わせフォーム resources :contacts, only: [:new, :create] post 'contacts/confirm', to: 'contacts#confirm', as: 'confirm' post 'contacts/back', to: 'contacts#back', as: 'back' get 'done', to: 'contacts#done', as: 'done' # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html get '*path', controller: 'application', action: 'render_404' end

teamcore.rb(モデル)

class Teamcore < ApplicationRecord validates_uniqueness_of :access_token validates_presence_of :access_token after_initialize :set_access_token, if: :new_record? validates :teamname, presence: true belongs_to :user,dependent: :destroy has_many :schedules, dependent: :destroy #private def set_access_token self.access_token = self.access_token.blank? ? generate_access_token : self.access_token end def generate_access_token tmp_token = SecureRandom.urlsafe_base64(6) self.class.where(:access_token => tmp_token).blank? ? tmp_token : generate_access_token end end
create_table "teamcores", force: :cascade do |t| t.integer "user_id", null: false t.text "teamname" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false t.string "access_token" t.index ["user_id"], name: "index_teamcores_on_user_id" end

試したこと

keyの設定がないとエラーが表示されたので下記の参考サイトを試しました。
https://teratail.com/questions/244048

ActionView::Template::Error (No route matches....missing required keys: [:id]):と
表示されました。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

no1knows

2022/10/26 23:01

参考サイトをベースに考えると、schedulesコントローラーにある:teamcores_teamnameカラムのパラメータをURLに利用する形になっていると思うのですが、そもそもそのカラムは設定してありますか?
ak_ruby

2022/10/27 03:15 編集

コメントありがとうございます!大変助かります。 :teamcores_teamnameカラムは設定しておりませんでした。 質問内容を修正しました。teamcoresのschema,rbを追加しました。 ※このteamnameカラムをURLに取り入れたいです。 ■分からないこと  schedulesコントローラーにカラムの設定が必要とのことですが  こちらはparams.require等に設定するという解釈で合っていますでしょうか。  例) params.require(:schedule).permit(:カラム名, :カラム名, :teamcores_teamname....)  schedulesコントローラー内にteamcore.rbのteamnameカラムを  どのように設定すべきかが理解できていないです...
no1knows

2022/10/27 12:01

カラムがない場合で考えると、下記のような形でストロングパラメータとしておいて params.require(:schedule).permit(.....).merge(teamcores_teamname: current_user.teamcore.teamname) indexなどschedule_paramsを利用していないアクションにも適宜teamcores_teamnameを設定してあげれば実現できそうな気がします。
guest

回答1

0

自己解決

no1knowsさんのコメントから解決できました。
コメントでいただいた内容のように
パラメーターの設定がなかったことが原因でした。

コントローラーの編集とViewファイルを編集しました。
大きく下記2点を編集しました。
■編集内容
①コントローラーファイルのストロングパラメータを修正
②コンローラーファイルやViewファイルのroutesのpathに修正
■各種コード
①コントローラーファイルのストロングパラメータ

def schedule_params params.require(:schedule).permit(:ymd, :start, :end, :place, :addcomment,:user_id,:teamcore_id).merge(teamcores_teamname: current_user.teamcore.teamname) end

②コンローラーファイルやViewファイルのroutesのpathに修正

#teamcores_teamnameはroutes.rbに設定したscopeのカラム名 new_schedule_path(teamcores_teamname: @team.teamname)

投稿2022/11/09 10:19

ak_ruby

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問