После установки метода to_param, вложенный ресурс не может быть создан - PullRequest
0 голосов
/ 16 марта 2019

У меня 2 модели, Комната и Сообщение, Комната has_many :messages.

URL для номеров # show был rooms/:room_id, я использовал to_param метод, чтобы отобразить url как rooms/:url_token. После этого я не смог создать сообщения из-за ошибки:

ActionController :: UrlGenerationError в MessagesController # create
нет маршрута матчей {: действие => "показать",: контроллер => "комнаты",: room_url_token => "ieghuEJA3WfgXuXqdR8XEGMZrYJF2nwnnoOGGwt5OApDGXGpPZL6Y368AqonrcbtLxeWgXkH / D5eRam + cvgSTDh7wM2hFW4jqpnHoOw / RbDgnQNxn14y6h8GouQRDR4Kj + Имма =="}, отсутствуют необходимые ключи: [: url_token]

Как я могу это исправить? Или как изменить room_url с сообщениями? Пожалуйста, помогите.

rake routes результат

                  signup GET  /signup(.:format)                                                                        rooms#new
                      POST /signup(.:format)                                                                        rooms#create
        room_messages POST /rooms/:room_url_token/messages(.:format)                                                messages#create
                rooms POST /rooms(.:format)                                                                         rooms#create
             new_room GET  /rooms/new(.:format)                                                                     rooms#new
                 room GET  /rooms/:url_token(.:format)                                                              rooms#show

messages_controller.rb

class MessagesController < ApplicationController
  before_action :set_room

  def create
    @message = @room.messages.new(message_params)
    if  @message.save
      flash[:success] = "posted"
      redirect_to @room
    else
      render 'new'
    end
  end

  private

    def message_params
      params.require(:message).permit(:name, :content)
    end

    def set_room
      @room = Room.find_by(url_token: params[:url_token])
    end
end

rooms_controller.rb

class RoomsController < ApplicationController
  before_action :set_room, only: :show

  def show
    @room = Room.find_by(url_token: params[:url_token])
    @messages = @room.messages.paginate(page: params[:page])
    @message = @room.messages.new
  end

  private

    def set_room
      @room = Room.find_by(url_token: params[:url_token])
    end 
end

url_token создан в модели комнаты:

class Room < ApplicationRecord
  has_many :messages, dependent: :destroy
  validates :title, presence: true, length: { maximum: 100 }
  validates :url_token, presence: true, uniqueness: true
  before_validation :generate_url_token

  def to_param
    url_token
  end

  private

    def generate_url_token
      self.url_token = SecureRandom.base64(100)
    end
end

модель сообщения

class Message < ApplicationRecord
  belongs_to :room
  default_scope -> { order(created_at: :asc) }
  validates :room_id, presence: true
  validates :name, presence: true, length: { maximum: 100 }
  validates :content, presence: true, length: { maximum: 1000 }
end

полный журнал ошибок

Started POST "/rooms/ieghuEJA3WfgXuXqdR8XEGMZrYJF2nwnnoOGGwt5OApDGXGpPZL6Y368AqonrcbtLxeWgXkH%2FD5eRam+cvgSTDh7wM2hFW4jqpnHoOw%2FRbDgnQNxn14y6h8GouQRDR4Kj+IMmA==/messages" for 153.203.168.240 at 2019-03-17 01:32:34 +0900
Cannot render console from 153.203.168.240! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
   (0.5ms)  SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
  ? /root/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/activerecord-5.2.2.1/lib/active_record/log_subscriber.rb:98
Processing by MessagesController#create as HTML
  Parameters: {"utf8"=>"?", "authenticity_token"=>"Rt2ek/0VX3TLN925qJkg7zYYlL3e7VUf6BF/mRsze5sVigmTjVzm6HcKz66RYuJCtjWl3T0Iv9qlQB47zf/f1w==", "message"=>{"name"=>"pryn", "content"=>"kokok"}, "commit"=>"Post", "room_url_token"=>"ieghuEJA3WfgXuXqdR8XEGMZrYJF2nwnnoOGGwt5OApDGXGpPZL6Y368AqonrcbtLxeWgXkH/D5eRam+cvgSTDh7wM2hFW4jqpnHoOw/RbDgnQNxn14y6h8GouQRDR4Kj+IMmA=="}
  Room Load (0.4ms)  SELECT  "rooms".* FROM "rooms" WHERE "rooms"."url_token" IS NULL LIMIT $1  [["LIMIT", 1]]
  ? app/controllers/messages_controller.rb:22
   (0.2ms)  BEGIN
  ? app/controllers/messages_controller.rb:7

  Message Create (1.0ms)  INSERT INTO "messages" ("name", "content", "room_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["name", "pryn"], ["content", "kokok"], ["room_id", 1], ["created_at", "2019-03-16 16:32:34.837275"], ["updated_at", "2019-03-16 16:32:34.837275"]]
  ? app/controllers/messages_controller.rb:7
   (0.5ms)  COMMIT
  ? app/controllers/messages_controller.rb:7
Redirected to
Completed 500 Internal Server Error in 40ms (ActiveRecord: 7.9ms)



ActionController::UrlGenerationError (No route matches {:action=>"show", 
:controller=>"rooms", :url_token=>nil}, missing required keys: 
[:url_token]): 

в route.rb

Rails.application.routes.draw do
  resources :rooms, only: [:create, :new, :show], param: :url_token do
    resources :messages, only: [:create]
  end
end

1 Ответ

2 голосов
/ 16 марта 2019

По вашим маршрутам:

room_messages POST /rooms/:room_url_token/messages(.:format)

это параметр :room_url_token, отправляемый на запрос, а не :url_token.
Вы можете проверить это в своих журналах здесь:

Processing by MessagesController#create as HTML
  Parameters: {"utf8"=> ... "room_url_token"=>"ieghuEJA3WfgXuXqdR8XEGMZrYJF2nwnnoOGGwt5OApDGXGpPZL6Y368AqonrcbtLxeWgXkH/D5eRam+cvgSTDh7wM2hFW4jqpnHoOw/RbDgnQNxn14y6h8GouQRDR4Kj+IMmA=="}

В вашем MessagesController исправьте метод set_room следующим образом:

def set_room
  @room = Room.find_by(url_token: params[:room_url_token])
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...