mazeltov7のweb断片

備忘録的なテキトーなことを書きます。(技術記事はQiitaに移行しました http://qiita.com/mazeltov7 )

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