我是RoR的新手,我正在尝试构建一个Web应用程序。 我有一个带有Post的用户的经典应用程序。
其他模型Online用于将帖子放在公共墙上,并且它与嵌套表单Orders相关联,表示可用的部分。
所以现在,我正在尝试使用我的帖子显示视图中的“删除”动作更新订单,但是铁路说他找不到帖子'id'=使用私有方法设置在线,这是有效的创建订单。 (照片)
Onlines controller:
class OnlinesController < ApplicationController
before_action :authenticate_user!
before_action :set_post
before_action :owned_online, only: [:new, :update]
before_action :set_online, except: [:taked]
before_action :set_unline, only: [:taked]
def new
@online = current_user.onlines.build
@online.post_id = @post.id
@online.user_id = current_user.id
end
def edit
end
def taked
@online.orders.update(taked: false, taked_at: Time.zone.now, taked_by: current_user)
end
def create
if Online.where(post_id: params[:post_id]).any?
@online = Online.where(post_id: params[:post_id]).last.update_attributes(push: false)
end
@online = @post.onlines.create(online_params)
if @online.save
if @online.portion <= 0
@online.update(push: false)
flash[:success] = 'Veuillez indiquer le nombre de parts disponibles '
redirect_to root_path
else
@online.update(pushed_at: Time.zone.now)
@online.update(push: true)
flash[:success] = 'Votre post est en ligne !'
redirect_to root_path
end
else
render 'new'
end
end
def update
if @onlines.update(online_params)
if @online.push == false
if @online.portion <= 0
@online.update(push: false)
flash[:success] = 'Veuillez indiquer le nombre de parts disponibles '
redirect_to root_path
else
@online.update(push: true)
flash[:success] = 'Votre post a bien été pushé !'
redirect_to root_path
end
end
else
@user.errors.full_messages
flash[:error] = @user.errors.full_messages
render :edit
end
end
private
def online_params
params.require(:online).permit(:user_id, :post_id, :prix, :portion, :push, :pushed_at, orders_attributes: [:id, :taked, :taked_at, :taked_by, :validated_at, :validated_by, :_destroy])
end
def owned_online
@post = Post.find(params[:post_id])
unless current_user == @post.user
flash[:alert] = "That post doesn't belong to you!"
redirect_to :back
end
end
def set_post
@post = Post.find_by(params[:post_id])
end
def set_online
@post = Post.find(params[:post_id])
@online = Online.find_by(params[:id])
end
def set_unline
@online = Online.find_by(params[:id])
end
end
class Online < ActiveRecord::Base
belongs_to :post
belongs_to :user
has_many :orders
accepts_nested_attributes_for :orders, allow_destroy: true
scope :push, ->{ where(push: true).order("pushed_at DESC") }
end
观看/发布/显示:
<div class="btn-group" role="group" aria-label="...">
<%= link_to '- Pusher - ', new_post_online_path(@post), data: { confirm: 'Confirmer la mise en ligne de #{@title}?' }, class: "btn btn-primary " %>
<div class="col-md-9">
<h3>Parts :</h3>
<div id="Orders">
<ul>
<%- @post.onlines.each do |online| %>
<%- online.orders.each do |order| %>
<%- if order.taked == false %>
<li>
<%= link_to 'Take', taked_online_path(online), method: :update, class: "btn btn-warning"%>
</li>
<%end%>
<%end%>
<%end%>
</ul>
</div>
</div>
路线:
Rails.application.routes.draw do
get 'profiles/show'
mount RailsAdmin::Engine => '/admin', as: 'rails_admin'
devise_for :users, :controllers => { registrations: 'registrations' }
resources :posts do
resources :comments
resources :onlines do
resources :orders
end
end
get ':pseudo', to: 'profiles#show', as: :profile
get ':pseudo/edit', to: 'profiles#edit', as: :edit_profile
patch ':pseudo/edit', to: 'profiles#update', as: :update_profile
put 'online/:id/taked', to: 'onlines#taked', as: :taked_online
root 'posts#index'
所以,如果您对此有任何建议,我会接受它! 感谢
答案 0 :(得分:1)
无法找到带有&#39; id&#39; =
的帖子
您有before_action :set_online
在 该cntroller的所有操作被触发 之前,在@post
的帮助下为params{:post_id]
分配了post_id
。但taked
操作没有before_action :set_online
,因此 失败 报告错误。您可以通过将before_action :set_online, except: [:taked]
更改为@online
, 来避免此检查,但这又不会为{分配 taked
{1}}该方法需要 。
因此,只有您选择 删除分配 @post
方法中的set_online
。
def set_online
@online = Online.find_by(params[:id])
end
此外,您的代码需要进行一些更改。首先,taked_online
的 路径 是错误的。它应该是
put 'online/:id/taked', to: 'onlines#taked', as: :taked_online
正在使用 更新 ,而不是 创建 。
最后,需要调整taked
方法。
def taked
@online.orders.update(taked: false, taked_at: Time.zone.now, taked_by: current_user)
end