【问题标题】:URL changes into dot instead of slashURL 变为点而不是斜线
【发布时间】:2016-10-12 13:30:01
【问题描述】:

我正在构建一个预订系统,因此用户可以查看他们的行程。一个预订属于_一个房间,一个房间有_可以预订,所以@room 是一个外键。我想将房间的图像链接到陈列室视图。但是,当我单击该链接时,URL 将更改为 c9users.io/rooms.1 而不是 c9users.io/rooms/1

完成这项工作需要哪些步骤?

是什么导致了这种行为?

看起来不像是复数错误,因为我也试过:

<%= link_to room_path(trip.room) do %> 

不幸的是结果是一样的。

your_trips.html.erb

<% @trips.each do |trip| %>
        <%= link_to rooms_path(trip.room) do %>
            <div>
                <%= image_tag trip.room.photos[0].image.url(:thumb) if trip.room.photos.length > 0 %>
            </div>
        <% end %>
<% end %>

routes.rb

Rails.application.routes.draw do

  root 'static_pages#welcome'

  devise_for :admin_users, ActiveAdmin::Devise.config
  ActiveAdmin.routes(self)
  devise_for :users,
             :path => '',
             :path_names => {:sign_in => 'login', :sign_out => 'logout', :edit => 'profile'},
             :controllers => {:omniauth_callbacks => 'omniauth_callbacks'}

  get 'rentout' => 'static_pages#rentout'
  get 'about' => 'static_pages#about'
  get 'impressum' => 'static_pages#impressum'

  resources :rooms, only: [:index, :show]
  resources :photos

  resources :rooms do 
    resources :reservations, only: [:create]
  end

  get '/preload' => 'reservations#preload'
  get '/preview' => 'reservations#preview'

  get '/your_trips' => 'reservations#your_trips'
end

reservations_controller.rb

class ReservationsController < ApplicationController
    before_action :authenticate_user!

    def preload
        room = Room.find(params[:room_id])
        today = Date.today
        reservations = room.reservations.where("start_date >= ? OR end_date >= ?", today, today)

        render json: reservations
    end

    def preview
        start_date = Date.parse(params[:start_date])
        end_date = Date.parse(params[:end_date])

        output = {
            conflict: is_conflict(start_date, end_date)
        }

        render json: output
    end

    def create
        @room = Room.find(params[:room_id])
        @reservation = current_user.reservations.create(reservation_params.merge(room_id: @room.id))
        redirect_to @reservation.room, notice: "Your reservation has been created"
    end

    def your_trips
        @trips = current_user.reservations
    end

    private
        def is_conflict(start_date, end_date)
            room = Room.find(params[:room_id])

            check = room.reservations.where("? < start_date AND end_date < ?", start_date, end_date)
            check.size > 0? true : false
        end

        def reservation_params
            params.require(:reservation).permit(:start_date, :end_date, :price, :total, :room_id)
        end
end

rooms_controller.rb

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

  def index
    @rooms = Room.all
  end

  def show
    @photos = @room.photos
  end

  private
    def set_room
      @room = Room.find(params[:id])
    end
end

我正在使用带有 Cloud9 IDE 的 Rails 5.0.1。

【问题讨论】:

    标签: ruby-on-rails routing


    【解决方案1】:

    您似乎定义了两次 rooms 资源:

    resources :rooms, only: [:index, :show]
    resources :photos
    
    resources :rooms do 
      resources :reservations, only: [:create]
    end
    

    您可以合并:

    resources :photos
    
    resources :rooms, only: [:index, :show] do 
      resources :reservations, only: [:create]
    end
    

    我不能 100% 确定这会解决您的问题,但这是我会尝试的第一件事。

    【讨论】:

    • 感谢分配,这让我发疯了!然后我不得不将 更改为单数 ,现在它就像一个魅力! ;) 再次感谢您!
    • 哦,我在您的问题中没有看到任何关于 rooms_path 的信息。如果您使用复数形式的rooms_path,您的room.id 将应用于索引路由中可选的format 占位符。 (通常format 用于xmljsonjspdf 等文件扩展名,如rooms_path(:csv) => /rooms.csv。)希望这是有道理的。
    猜你喜欢
    • 1970-01-01
    • 2014-08-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多