加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Rails 4嵌套浅层路由:如何在子控制器中获取父

发布时间:2020-12-17 02:24:48 所属栏目:百科 来源:网络整理
导读:在我的Rails 4应用程序中,有四种模型: class User ActiveRecord::Base has_many :administrations has_many :calendars,through: :administrationsendclass Calendar ActiveRecord::Base has_many :administrations has_many :users,through: :administrati
在我的Rails 4应用程序中,有四种模型:

class User < ActiveRecord::Base
  has_many :administrations
  has_many :calendars,through: :administrations
end

class Calendar < ActiveRecord::Base
  has_many :administrations
  has_many :users,through: :administrations
  has_many: :posts
end

class Administration < ActiveRecord::Base
  belongs_to :user
  belongs_to :calendar
end

class Post < ActiveRecord::Base
  belongs_to :calendar
end

有了这个路由:

Rails.application.routes.draw do

  root to: 'pages#home'

  devise_for :users,:path => 'account'

  resources :calendars do
    resources :posts,shallow: true
  end

end

这给出了这些路线:

Prefix Verb   URI Pattern                                 Controller#Action
                   posts GET    /posts(.:format)                            posts#index
                         POST   /posts(.:format)                            posts#create
                new_post GET    /posts/new(.:format)                        posts#new
               edit_post GET    /posts/:id/edit(.:format)                   posts#edit
                    post GET    /posts/:id(.:format)                        posts#show
                         PATCH  /posts/:id(.:format)                        posts#update
                         PUT    /posts/:id(.:format)                        posts#update
                         DELETE /posts/:id(.:format)                        posts#destroy
                    root GET    /                                           pages#home
        new_user_session GET    /account/sign_in(.:format)                  devise/sessions#new
            user_session POST   /account/sign_in(.:format)                  devise/sessions#create
    destroy_user_session DELETE /account/sign_out(.:format)                 devise/sessions#destroy
           user_password POST   /account/password(.:format)                 devise/passwords#create
       new_user_password GET    /account/password/new(.:format)             devise/passwords#new
      edit_user_password GET    /account/password/edit(.:format)            devise/passwords#edit
                         PATCH  /account/password(.:format)                 devise/passwords#update
                         PUT    /account/password(.:format)                 devise/passwords#update
cancel_user_registration GET    /account/cancel(.:format)                   devise/registrations#cancel
       user_registration POST   /account(.:format)                          devise/registrations#create
   new_user_registration GET    /account/sign_up(.:format)                  devise/registrations#new
  edit_user_registration GET    /account/edit(.:format)                     devise/registrations#edit
                         PATCH  /account(.:format)                          devise/registrations#update
                         PUT    /account(.:format)                          devise/registrations#update
                         DELETE /account(.:format)                          devise/registrations#destroy
       user_confirmation POST   /account/confirmation(.:format)             devise/confirmations#create
   new_user_confirmation GET    /account/confirmation/new(.:format)         devise/confirmations#new
                         GET    /account/confirmation(.:format)             devise/confirmations#show
             user_unlock POST   /account/unlock(.:format)                   devise/unlocks#create
         new_user_unlock GET    /account/unlock/new(.:format)               devise/unlocks#new
                         GET    /account/unlock(.:format)                   devise/unlocks#show
          calendar_posts GET    /calendars/:calendar_id/posts(.:format)     posts#index
                         POST   /calendars/:calendar_id/posts(.:format)     posts#create
       new_calendar_post GET    /calendars/:calendar_id/posts/new(.:format) posts#new
                         GET    /posts/:id/edit(.:format)                   posts#edit
                         GET    /posts/:id(.:format)                        posts#show
                         PATCH  /posts/:id(.:format)                        posts#update
                         PUT    /posts/:id(.:format)                        posts#update
                         DELETE /posts/:id(.:format)                        posts#destroy
               calendars GET    /calendars(.:format)                        calendars#index
                         POST   /calendars(.:format)                        calendars#create
            new_calendar GET    /calendars/new(.:format)                    calendars#new
           edit_calendar GET    /calendars/:id/edit(.:format)               calendars#edit
                calendar GET    /calendars/:id(.:format)                    calendars#show
                         PATCH  /calendars/:id(.:format)                    calendars#update
                         PUT    /calendars/:id(.:format)                    calendars#update
                         DELETE /calendars/:id(.:format)                    calendars#destroy

最后,这是posts_controller.rb的内容:

class PostsController < ApplicationController
  before_action :set_post,only: [:show,:edit,:update,:destroy]

  # GET /posts
  # GET /posts.json
  def index
    @posts = Post.all
  end

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

  # GET /posts/new
  def new
    @post = Post.new
  end

  # GET /posts/1/edit
  def edit
  end

  # POST /posts
  # POST /posts.json
  def create
    @calendar = Calendar.find(params[:calendar_id])
    @post = @calendar.posts.create(post_params)

    respond_to do |format|
      if @post.save
        format.html { redirect_to calendar_path(@calendar),notice: 'Post was successfully created.' }
        format.json { render :show,status: :created,location: @post }
      else
        format.html { render :new }
        format.json { render json: @post.errors,status: :unprocessable_entity }
      end
    end
  end

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

  # DELETE /posts/1
  # DELETE /posts/1.json
  def destroy
    @calendar = Calendar.find(params[:calendar_id])
    @post.destroy
    respond_to do |format|
      format.html { redirect_to calendar_path(@calendar),notice: 'Post was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

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

    # Never trust parameters from the scary internet,only allow the white list through.
    def post_params
      params.require(:post).permit(:date,:time,:subject,:format,:copy,:media)
    end
end

我一直遇到类似的错误.

问题#1:当我尝试从show.html.erb日历视图中删除帖子时:

<h2><%= @calendar.name %> Calendar</h2>

<h3>Posts</h3>
<% if @calendar.posts.any? %>
    <table>
        <tr>
            <th>Date</th>
            <th>Time</th>
            <th>Subject</th>
            <th>Format</th>
            <th>Copy</th>
            <th>Media</th>
        </tr>
  <% @calendar.posts.each do |post| %>
        <tr>
        <td><%= post.date %></td>
            <td><%= post.time %></td>
            <td><%= post.subject %></td>
            <td><%= post.format %></td>
            <td><%= post.copy %></td>
            <td><%= post.media %></td>
        <td><%= link_to 'View',post %></td>
        <td><%= link_to 'Update',edit_post_path(post) %></td>
        <td><%= link_to 'Delete',post,method: :delete,data: { confirm: 'Are you sure?' } %></td>
        </tr>
    </table>
  <% end %>
...

我明白了:

ActiveRecord::RecordNotFound in PostsController#destroy
Couldn't find Calendar with 'id'=

问题2:当我尝试从edit.html.erb帖子视图更新帖子时:

<h1>Editing Post</h1>

<%= render 'form' %>

<%= link_to 'Show',@post %> |
<%= link_to 'Back',posts_path %>

我明白了:

ActiveRecord::RecordNotFound in PostsController#update
Couldn't find Calendar with 'id'=

问题3:当我尝试从show.html.erb帖子视图返回show.html.erb日历视图时:

<div>
    <p>Date</p>
    <%= @post.date %>
</div>
<div>
    <p>Time</p>
    <%= @post.time %>
</div>
<div>
    <p>Subject</p>
    <%= @post.subject %>
    </div>
<div>
    <p>Format</p>
    <%= @post.format %>
    </div>
<div>
    <p>Copy</p>
    <%= @post.copy %>
</div>
<div>
    <p>Media</p>
    <%= @post.media %>
</div>

<%= link_to 'Edit',edit_post_path(@post) %> |
<%= link_to 'Back',posts_path %>

我明白了:

ActiveRecord::RecordNotFound in PostsController#show
Couldn't find Calendar with 'id'=

如果我对错误的解释是正确的,那么每次问题似乎都是我无法检索帖子所属的日历的ID.

换句话说,我无法从子(post)控制器中检索父(日历)id.

我相信这是一个与我的嵌套浅层资源以及我在视图中构建链接的方式相关的问题.

我无法弄清楚如何使这些链接工作.

如果您可以为我提供解决方案 – 最重要的是推理 – 对于上述三种情况之一,我绝对能够为其他两种情况提出解决方案.

任何的想法?

解决方法

我找到了解决我的三个问题的每个问题.

问题#1:我换了:

format.html { redirect_to calendar_path(@calendar),notice: 'Post was successfully destroyed.' }

有:

format.html { redirect_to calendar_path(@post.calendar_id),notice: 'Post was successfully destroyed.' }

在posts_controller.rb中.

问题#2:我换了:

<%= link_to 'Back',posts_path %>

有:

<%= link_to 'Back',calendar_path(@post.calendar_id) %>

在edit.html.erb帖子视图中.

问题3:我换了:

<%= link_to 'Back',posts_path %>

有:

calendar_path(@post.calendar_id)

在show.html.erb帖子视图中

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读