【发布时间】:2016-02-03 14:19:32
【问题描述】:
我有一个 Rails 应用程序,用户可以在其中列出和编辑有关他们拥有的车辆的信息。一个用户拥有_许多车辆,而一个车辆属于_一个用户。
在用户个人资料中有一个用于创建新车辆的表单。
我可以在用户个人资料中显示自有车辆列表,并带有删除链接,但是当我使用 edit_vehicle_path 添加编辑操作的链接时,我只能获得 ID 相同的车辆链接到用户 ID。
users_controller.rb 看起来像这样:
class UsersController < ApplicationController
before_action :correct_user, only: [:show]
def show
@user = User.find(params[:id])
@vehicles = @user.vehicles
@vehicle = current_user.vehicles.build if user_signed_in?
end
private
# before filters
# Each user can access only his own profile
def correct_user
@user = User.find(params[:id])
redirect_to(root_url) unless current_user == @user
end
end
vehicles_controller.rb 如下所示:
class VehiclesController < ApplicationController
before_action :authenticate_user!, only: [:create, :destroy]
before_action :correct_user, only: [:destroy, :edit, :update]
def create
@vehicle = current_user.vehicles.build(vehicle_params)
if @vehicle.save
flash[:success] = "New vehicle added!"
redirect_to current_user
else
flash[:danger] = "Houston, we got a problem!"
render current_user
end
end
def edit
# @vehicle is already defined in correct_user which is called before_action
end
def update
# @vehicle is already defined in correct_user which is called before_action
if @vehicle.update_attributes(vehicle_params)
flash[:success] = "Vehicle updated"
redirect_to current_user
else
render 'edit'
end
end
def destroy
@vehicle.destroy
flash[:success] = "Vehicle removed"
redirect_to request.referrer || root_url
end
private
def vehicle_params
params.require(:vehicle).permit(:name, :matriculation_date)
end
# before filters
# Each user can remove/edit/destroy only the vehicles he owns
def correct_user
@vehicle = current_user.vehicles.find_by(id: params[:id])
redirect_to root_url if @vehicle.nil?
end
end
routes.rb:
Rails.application.routes.draw do
devise_for :users
root 'static_pages#home'
resources :users, only: [:show, :index]
resources :vehicles, only: [:create, :edit, :update, :destroy]
end
我用来显示单车信息的部分是:
<li id="micropost-<%= vehicle.id %>">
<span class="name"><%= vehicle.name %></span>
<span class="matriculation"><%= vehicle.matriculation_date %></span>
<span class="id"> - id: <%= vehicle.id %></span>
<%= link_to '<i class="fa fa-cog"></i> edit'.html_safe, edit_vehicle_path %>
<%= link_to '<i class="fa fa-trash"></i> delete'.html_safe, vehicle, method: :delete, data: { confirm: "You sure?" } %>
</li>
完整的用户/节目视图是这样的:
<%= form_for(@vehicle) do |f| %>
<%= f.label :name, "Vehicle name" %>
<%= f.text_field :name, class: 'form-control' %>
<%= f.label :matriculation_date %>
<%= f.date_field :matriculation_date, class: 'form-control' %>
<%= f.submit "Add", class: "btn btn-primary" %>
<% end %>
<h3>User email: <%= @user.email %></h3>
<% if @user.vehicles.any? %>
<h3>Vehicles (<%= @user.vehicles.count %>)</h3>
<ol>
<%= render @vehicles %>
</ol>
<% end %>
谢谢
【问题讨论】:
标签: ruby-on-rails ruby