【问题标题】:Rails - link to edit another model within User profilesRails - 在用户配置文件中编辑另一个模型的链接
【发布时间】: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


    【解决方案1】:

    edit_vehicle_path 需要知道vehicle 才能建立正确的链接。改成:

    <%= link_to '<i class="fa fa-cog"></i> edit'.html_safe, edit_vehicle_path(vehicle) %>
    

    【讨论】:

      【解决方案2】:

      在我看来,使用nested Routes 会更好。

      resources :users, only: [:show, :index] do
        resources :vehicles, only: [:create, :edit, :update, :destroy]
      end
      

      请注意,这也会更改您的路线助手和路径,但更清楚的是,您编辑的是用户汽车。

      edit_user_vehicle_path(@user, @vehicle) 
      # => /users/1/vehicles/2/edit
      

      【讨论】:

      • 很有趣,我一定会试一试
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-27
      • 1970-01-01
      • 2020-07-03
      • 1970-01-01
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多