ruby-on-rails – Rails 4嵌套浅层路由:如何在子控制器中获取父
|
在我的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帖子视图中 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
