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

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

ただいまの
回答率

90.51%

  • Ruby

    9434questions

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

  • SQLite

    786questions

    SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

  • Sinatra

    88questions

    Sinatraは、Rubyで作られた オープンソースのWebアプリケーションフレームワークです。

【至急】Sinatraでのデータベース接続エラーの解消法

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,213

it-bamboo

score 3

【至急】Sinatra でのデータベース接続の問題について

わけあってこのプログラムは本日23時までに完成されければなりません!!
よろしくお願いします!!!!!

こんにちは。

現在 Ruby の勉強がてら、Sinatra というフレームワークを使用して簡単な会員登録型TODOサービスを制作しているのですが、その中でデータベースの接続をしようとすると
「Internal Server Error
undefined method `join' for #<String:0x000000...>」
というエラーに見舞われてしまいました...
サーバーの再起動など色々と試みてみたのですが、全く解決策が見えないため、質問させていただきます。
以下が各コードになります。もし不足している物があれば補足しますので、よろしくお願いします。

[ マイグレショーンファイル ]
class CreateItems < ActiveRecord::Migration
  def change
    create_table :todo do |t|
      t.integer :userid
      t.string :title
      t.string :detail
      t.datetime :dl
      t.timestamps null: false
    end
    create_table :users do |t|
      t.string :name
      t.string :loginid
      t.string :password
      t.timestamps null: false
    end
  end
end

※ マイグレーションには成功しており、データベースのテーブル構築には成功しています。

「スキーマ」
ActiveRecord::Schema.define(version: 20150813013659) do

  create_table "todo", force: :cascade do |t|
    t.integer  "userid"
    t.string   "title"
    t.string   "detail"
    t.datetime "dl"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "users", force: :cascade do |t|
    t.string   "loginid"
    t.string   "password"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string   "name"
  end

end

「app.rb」
(ログイン機能はなんとか実装したので省略します。必要があればご連絡ください。)

require 'bundler/setup'
Bundler.require
require 'sinatra/reloader' if development?
require 'open-uri'
require "sinatra/json"

require 'date'

require 'sinatra'
require 'sinatra/activerecord'

require 'sinatra/cookies'

require './models/todo.rb' # 下にコードを
require './models/users.rb' # 掲載しています

Time.zone = "Tokyo"
ActiveRecord::Base.default_timezone = :local

class Server < Sinatra::Base
end

enable :sessions
set :session_secret, "ランダムな英数字32文字"

# メイン画面
get '/home' do
  if session[:user_id] != nil
    # ログイン成功
    
    @user = Users.where(:id => session[:user_id]).first
    
    @todo = Todo.where(:id => session[:user_id]) # ☆おそらくこのコードに問題があります...

    erb :home
  else
    redirect '/' # ログイン画面へ
  end

end

・モデルたち
「./models/user.rb」
ActiveRecord::Base.establish_connection(ENV['DATABASE_URL']||"sqlite3:db/development.db")
class Users < ActiveRecord::Base
    validates :loginid, uniqueness: true
    has_many :todo
end

「./models/todo.rb」
ActiveRecord::Base.establish_connection(ENV['DATABASE_URL']||"sqlite3:db/development.db")
class Todo < ActiveRecord::Base
    belongs_to :users
end
個人的にはTodoモデルが正常に動作していないような気がします...
どなたか解決策をお教えください...
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

時間過ぎてますが、一応。

まず、リレーションのIDを格納するカラム名がおかしそう
t.integer  "userid"
ではなく
t.integer  "user_id"
では?

次に、どういう実装を考えているのかわかりかねるので、もしかすると外しているかもしれませんが
@user = Users.where(:id => session[:user_id]).first
@todo = Todo.where(:id => session[:user_id]) # ☆おそらくこのコードに問題があります.
# こうでは?
@user = User.find(session[:user_id])
@todo = @user.todo
# もしくは
@todo = Todo.where(user_id: session[:user_id]).all
そもそも、has_manyでtodoだと単数形なので、has_many :todosでは?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

以下のサイトに記述されている問題でしょうか?
Sinatraでundefined method join for stringが出る

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • Ruby

    9434questions

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

  • SQLite

    786questions

    SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

  • Sinatra

    88questions

    Sinatraは、Rubyで作られた オープンソースのWebアプリケーションフレームワークです。