创建一个新视图,显示来自特定用户的数据库中的列表

时间:2016-01-13 13:55:45

标签: ruby-on-rails-4 authentication devise

我有一个使用Devise的市场风格的电子商务rails应用程序。我正在尝试创建一个新视图,以便买家可以查看特定用户的所有列表。此视图应该是打开的,以便任何用户(登录/注销)都可以查看此页面。我在创建这样的页面时遇到了很多麻烦。 (我是rails的新手,无法理解如何使这项工作)任何帮助都会很棒。我猜我需要创建一个新路由,在控制器中定义它,然后创建一个匹配的视图页面。但是,我无法理清如何做到这一点。

我目前的路线:

Rails.application.routes.draw do

  mount RailsAdmin::Engine => '/admin', as: 'rails_admin'
  resources :categories

  devise_for :users
  resources :listings do
    resources :orders, only: [:new, :create]




  end
  get 'pages/about'
  get 'pages/contact'
  get 'seller' => "listings#seller"
  get 'sales' => "orders#sales"
  get 'purchases' => "orders#purchases"

# or

  root 'listings#index'


end

我的列表控制器:

class ListingsController < ApplicationController
  before_action :set_listing, only: [:show, :edit, :update, :destroy]
  before_filter :authenticate_user!, only: [:seller, :new, :create, :edit, :update, :destroy]
  before_filter :check_user, only: [:edit, :update, :destroy]

  def seller
    @listings = Listing.where(user: current_user).order("created_at DESC")
  end

  # GET /listings
  # GET /listings.json
  def index
    if params[:category].blank?
      @listings = Listing.all.order("created_at DESC").paginate(:page => params[:page], :per_page => 16)
    else
      @category_id = Category.find_by(name: params[:category]).id
      @listings = Listing.where(category_id: @category_id).order("created_at DESC").paginate(:page => params[:page], :per_page => 16)
    end
  end

  # GET /listings/1
  # GET /listings/1.json
  def show
  end

  # GET /listings/new
  def new
    @listing = Listing.new
  end

  # GET /listings/1/edit
  def edit
  end

  # POST /listings
  # POST /listings.json
  def create
    @listing = Listing.new(listing_params)
    @listing.user_id = current_user.id

    if current_user.recipient.blank?
      Stripe.api_key = ENV["STRIPE_API_KEY"]
      token = params[:stripeToken]

      recipient = Stripe::Recipient.create(
        :name => current_user.name,
        :type => "individual",
        :bank_account => token
        )


    current_user.recipient = recipient.id
    current_user.save

end

    respond_to do |format|
      if @listing.save
        format.html { redirect_to @listing, notice: 'Listing was successfully created.' }
        format.json { render :show, status: :created, location: @listing }
      else
        format.html { render :new }
        format.json { render json: @listing.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /listings/1
  # PATCH/PUT /listings/1.json
  def update
    respond_to do |format|
      if @listing.update(listing_params)
        format.html { redirect_to @listing, notice: 'Listing was successfully updated.' }
        format.json { render :show, status: :ok, location: @listing }
      else
        format.html { render :edit }
        format.json { render json: @listing.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /listings/1
  # DELETE /listings/1.json
  def destroy
    @listing.destroy
    respond_to do |format|
      format.html { redirect_to listings_url, notice: 'Listing was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_listing
      @listing = Listing.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def listing_params
      params.require(:listing).permit(:name, :category_id, :description, :price, :image)
    end

    def check_user
      if current_user != @listing.user
        redirect_to root_url, alert: "Sorry, this listing belongs to someone else"
      end
    end  
end

我的房源模型:

class Listing < ActiveRecord::Base
  if Rails.env.development?
        has_attached_file :image, :styles => { :medium => "200x", :thumb => "100x100>" }, :default_url => "404.jpg"
  else
        has_attached_file :image, :styles => { :medium => "200x", :thumb => "100x100>" }, :default_url => "404.jpg",
                    :storage => :dropbox,
                    :dropbox_credentials => Rails.root.join("config/dropbox.yml"),
                    :path => ":style/:id_:filename"
   end              
  validates_attachment_content_type :image, :content_type => /\Aimage\/.*\Z/

  validates :name, :category_id, :description, :price, presence: true
  validates :price, numericality: { greater_than: 0}
  validates_attachment_presence :image

  belongs_to :user
  belongs_to :category
  has_many :orders




end

1 个答案:

答案 0 :(得分:0)

假设您想要在网址/users/1234/listings中添加用户列表,则可以创建这样的路由

match "/users/:user_id/listing" => "user_listings#index", via: :get

将指向UserListingsController,您可以在其中访问user_id。那么你可以实现类似这样的东西

class UserListingsController < ApplicationController
  before_action :set_user

  def index
    @listings = Listing.where(user: @user).order("created_at DESC")
  end

  private

  def set_user
    @user = User.find(params[:user_id])
  end
end

并在index.html.erb

中添加相应的app/views/user_listings

这可能就是我的意思。显然还有很多其他方法。我希望这有助于确定您的功能的实现。