2012-03-31 9 views
0

RoRチュートリアルのUserモデルとMicropostモデルの2つのモデルを持つRailsアプリケーションがあります。 私はRailsを使い始めるためにTwitterアプリケーション全体を実装しました。Railsアプリケーションのモデルを正しく実装する - Rails

私はライドシェアアプリケーションを作成するコードを使いたいと思っていました。彼らは乗り込む乗り物(運転するとき)を掲示し、乗客になりたいときに乗車し、彼らの乗り物を(ちょうどポストの代わりに)自分のフィードに乗せ、他のユーザーが続いている。 「ユーザー」は実際にはドライバーとパッセンジャーの2つの役割を果たすことがわかります。私はドライバーにはいいです。それはポストの作者だけです。変更する必要はありません。 しかし、乗客はいません...

私が望むもの:各乗り物のポストに「ホップイン」ボタンがあります - ユーザーがクリックすると、ボタンは「ジャンプオフ」に変わり、レコードはdb PassengerRideテーブル(ride_id、passenger_id)//「ジャンプオフ」をクリックすると、ボタンが「ホップイン」に変わり、保存されたレコードがPassengerRideテーブルから削除されます。私が何をしたか

:私は、次の実装を模倣し、私は

1欲しいものに適応しようとしたが)

で )ユーザーとMicropostの間に多くの関係に多くの(PassengerRideテーブルを生成しましたpassenger_ride.rbで
rails generate model PassengerRide ride_id:integer passenger_id:integer 

2):

attr_accessible :ride_id 

編集:私はそれが問題を解決するだろう期待してこれを削除し、それが問題を解決していませんでした。

3)関連付けを確立しました! (覚えている:私はUserテーブルとMicropostテーブル持っている)micropost.rbにpassenger_ride.rb

belongs_to :passenger, class_name: "User" 
    belongs_to :ride, class_name: "Micropost" 

user.rb

has_many :passenger_rides, foreign_key: "passenger_id", dependent: :destroy 
    has_many :rides, through: :passenger_rides, class_name: "Micropost" 

内を

has_many :passenger_rides, foreign_key: "ride_id", dependent: :destroy 
    has_many :passengers, through: :passenger_rides, source: :passenger, class_name: "User" 

4)passenger_rideレコードを作成するユーザーモデルのメソッド

def hopped_in?(ride) 
     self.passenger_rides.find_by_ride_id(ride.id) 
    end 

    def hop_in!(ride) 
     self.passenger_rides.create!(ride_id: ride.id) 
    end 

    def jump_off!(ride) 
    self.passenger_rides.find_by_ride_id(ride.id).destroy 
    end 

5)routes.rbを

resource :users do 
     member do 
      get :rides 
     end 
    end 

6にユーザコントローラ

に乗り物を追加)図:アプリ/ビュー/マイクロポスト/ _hopin.html.erb

<%= form_for(current_user.rides.build(ride_id: @micropost.id)) do |f| %> 
     <div><%= f.hidden_field :ride_id %></div> 
     <%= f.submit "Hop in", :class => "btn btn-large btn-primary" %> 
    <% end %> 

in app/views/microposts/_jumpoff.html.erb

<%= form_for(current_user.rides.find_by_ride_id(@micropost), 
     html: { method: :delete }) do |f| %> 
    <%= f.submit "Jump off", :class => "btn btn-large" %> 
    <% end %> 

in app/views/microposts/_ride_form.html。ERB

 <div id="ride_form"> 
     <% if current_user.hopped_in?(@micropost) %> 
       <%= render 'microposts/jumpoff' %> 
     <% else %> 
       <%= render 'microposts/hopin' %> 
     <% end %> 
     </div> 

次をレンダリングし、ローカルサーバー:

Started GET "/" for 127.0.0.1 at 2012-03-30 21:39:06 -0400 
    Processing by PagesController#home as HTML 
    ←[1m←[36mUser Load (0.0ms)←[0m ←[1mSELECT "users".* FROM "users" WHERE "users 
    "."remember_token" = 'R8o1mYu49bhrsrIyIPO-ow' LIMIT 1←[0m 
    ←[1m←[35m (0.0ms)←[0m SELECT DISTINCT "users".id FROM "users" INNER JOIN "rel 
    ationships" ON "users"."id" = "relationships"."followed_id" WHERE "relationships 
    "."follower_id" = 3 
    ←[1m←[36m (1.0ms)←[0m ←[1mSELECT COUNT(*) FROM "microposts" WHERE "microposts 
    "."user_id" = 3←[0m 
    Rendered shared/_user_info.html.erb (4.0ms) 
    ←[1m←[35m (0.0ms)←[0m SELECT COUNT(*) FROM "users" INNER JOIN "relationships" 
    ON "users"."id" = "relationships"."followed_id" WHERE "relationships"."follower 
    _id" = 3 
    ←[1m←[36m (0.0ms)←[0m ←[1mSELECT COUNT(*) FROM "users" INNER JOIN "relationsh 
    ips" ON "users"."id" = "relationships"."follower_id" WHERE "relationships"."foll 
    owed_id" = 3←[0m 
    ←[1m←[35m (0.0ms)←[0m SELECT COUNT(*) FROM "microposts" INNER JOIN "passenger 
    _rides" ON "microposts"."id" = "passenger_rides"."ride_id" WHERE "passenger_ride 
    s"."passenger_id" = 3 
    Rendered shared/_stats.html.erb (15.0ms) 
    ←[1m←[36m (0.0ms)←[0m ←[1mSELECT COUNT(*) FROM "microposts" WHERE (user_id IN 
    (1) OR user_id = 3)←[0m 
    ←[1m←[35mMicropost Load (0.0ms)←[0m SELECT "microposts".* FROM "microposts" W 
    HERE (user_id IN (1) OR user_id = 3) ORDER BY microposts.created_at DESC LIMIT 3 
    0 OFFSET 0 
    ←[1m←[36mUser Load (0.0ms)←[0m ←[1mSELECT "users".* FROM "users" WHERE "users 
    "."id" = 3 LIMIT 1←[0m 
    ←[1m←[35mPassengerRide Load (0.0ms)←[0m SELECT "passenger_rides".* FROM "pass 
    enger_rides" WHERE "passenger_rides"."passenger_id" = 3 AND "passenger_rides"."r 
    ide_id" IS NULL LIMIT 1 
    WARNING: Can't mass-assign protected attributes: ride_id 
    Rendered microposts/_hopin.html.erb (4.0ms) 
    Rendered microposts/_ride_form.html.erb (9.0ms) 
    Rendered shared/_feed_item.html.erb (15.0ms) 
    Rendered shared/_feed.html.erb (20.0ms) 
    Rendered pages/home.html.erb within layouts/application (46.0ms) 
    Completed 500 Internal Server Error in 155ms 


    ActionView::Template::Error (undefined method `ride_id' for #<Micropost:0x5f53a1 

    0>): 
     1: <%= form_for(current_user.rides.build(ride_id: @micropost.id)) do |f| %> 
     2: <div><%= f.hidden_field :ride_id %></div> 
     3: <%= f.submit "Hop in", :class => "btn btn-large btn-primary" %> 
     4: <% end %> 
    app/views/microposts/_hopin.html.erb:2:in `block in _app_views_microposts__hop 
    in_html_erb___661389729_52209444' 
    app/views/microposts/_hopin.html.erb:1:in `_app_views_microposts__hopin_html_e 
    rb___661389729_52209444' 
    app/views/microposts/_ride_form.html.erb:6:in `_app_views_microposts__ride_for 
    m_html_erb___54007412_52167144' 
    app/views/shared/_feed_item.html.erb:12:in `_app_views_shared__feed_item_html_ 
    erb___851424678_48417588' 
    app/views/shared/_feed.html.erb:3:in `_app_views_shared__feed_html_erb___10631 
    41135_48687708' 
    app/views/pages/home.html.erb:19:in `_app_views_pages_home_html_erb__74940785_ 
    48176280' 

私はより徹底することができませんでした、それを読むために時間を割いてありがとうございました!

答えて

2

部分にridesの代わりにpassenger_ridesとしてください。私:

<%= form_for(current_user.passenger_rides.build(ride_id: @micropost.id)) do |f| %> 
    <div><%= f.hidden_field :ride_id %></div> 
    <%= f.submit "Hop in", :class => "btn btn-large btn-primary" %> 
<% end %> 
+0

OMGはい。ありがとう、ありがとう、ありがとう。 – Myna

+1

答えが正しいとマークして、それを獲得したと思ったらポイントを追加してください。 ;-) – Nicholas

関連する問題