room毎のmessageとfind_by, whereの違い
簡単なrailsアプリ作って、ちょっと実験しました。
実験内容は、roomをユーザーが作って、そのroom内でmessageポストできるという至って単純なもの、ですが、例によって備忘録メモで残しときます。
rooms#showのviewから、messages#createのコントローラに飛ばして、やる感じにしました。
なので、routingも
resources :rooms resources :messages, :only=> "create"
としました。
messagesをネストして作るのもあるかと思ったけど、messagesをそこまでいじらないかなということで、こちらでやりました。
rooms#showのview
<%= form_for Message.new, :url => messages_path do |f| %> <%= f.text_field :username %> <%= f.text_field :body %> <%= f.hidden_field :room_id, value: @room.id %> <%= f.submit "Send" %> <% end %>
messages#createのcontroller
def create @message = Message.create(attributes) @room = Room.find_by(id: @message.room.id) if @message.save redirect_to room_path(@room), notice: 'success!' else redirect_to root_url, notice: 'got some error' end end private def attributes params.require(:message).permit(:username, :body, :room_id) end
こちらの@roomを、
@room = Room.where(id: @message.room.id)
としていたので、下のroom_path(@room)でエラーが出てました。
この理由は、whereで入れるとarrayになるので、@roomがarrayになってました。
binding.pryで見ると確かに、[]となってた。(find_byですると、<>となる。)
気に留めておきたいのは、以上!
ひどいコードだけど、いつかのために?GitHubに挙げておいた。
https://github.com/mazeltov7/room-message-sample