Правильно реализовать модели для приложения совместного использования ресурсов - Rails - PullRequest
0 голосов
/ 31 марта 2012

У меня есть приложение Rails с двумя моделями: модель User и модель Micropost, из учебного пособия по RoR. Я реализовал все приложение Twitter, чтобы начать работу с Rails.

Теперь я хотел использовать код, который мне нужен, чтобы создать приложение для обмена поездками: люди, публикующие поездки, которые они собираются совершать (когда они едут), подают заявки на поездку, когда хотят стать пассажирами, следуя пользователям, чтобы получить их поездки в их ленте (вместо просто сообщений) и сопровождаемые другими пользователями. Мы видим, что «пользователь» фактически играет две роли: водитель и пассажир. У меня все хорошо с водителем: это просто автор поста, без изменений. Но не пассажир ...

Что я хочу: иметь кнопку «Hop in» на каждом посте поездки - пользователь нажимает кнопку, кнопка превращается в «Jump off», и у нас есть запись, которая создается в БД, в таблице PassengerRide (ride_id, passenger_id) // когда мы нажимаем «Jump off», кнопка превращается в «Hop in», и сохраненная запись удаляется из таблицы PassengerRide.

Что я сделал: я пытался имитировать реализацию следующего и адаптироваться к тому, что я хочу

1) сгенерировал таблицу PassengerRide (отношение «многие ко многим» между пользователем и микросообщением) с

    rails generate model PassengerRide ride_id:integer passenger_id:integer

2) в passenger_ride.rb:

    attr_accessible :ride_id 

РЕДАКТИРОВАТЬ: Я удалил это, надеясь, что это решит проблему, и это не решило проблему.

3) создали ассоциации! (помните: у меня есть только таблица User и таблица Micropost)

в user.rb

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

in passenger_ride.rb

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

в микросообщении. Rb

    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) добавить аттракционы в пользовательский контроллер

в маршрутах. Rb

   resource :users do
       member do
          get :rides
       end
   end

6) просмотров: в приложении / views / microposts / _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 %>

в приложении / 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 %>

в приложении / 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'

Большое вам спасибо за то, что нашли время прочитать это, я не мог быть более тщательным!

1 Ответ

2 голосов
/ 31 марта 2012

Разве это не должно быть passenger_rides вместо rides в частичном _hopin.html.erb?Т.е.:

<%= 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 %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...