【问题标题】:Nested Resources - No route matches嵌套资源 - 没有路线匹配
【发布时间】:2014-03-11 12:56:28
【问题描述】:

我的 Rails4 应用程序中的嵌套资源有问题。我在这里错过了什么?

  • 我可以很好地查看participants/new.html.erb 表单,但是当我提交它时返回“No route matches [POST]”/examinations/1-ales/participations/new” 错误。

  • 当我尝试编辑参与时,例如此 url:localhost:3000/examinations/1-ales/participations/15/edit 正在返回“ActionController::ParameterMissing in ParticipationsController#edit”和“未找到参数:参与”。

    • 编辑和销毁 index.html.erb 文件中的链接导致错误:

    ActionController::UrlGenerationError in Participations#index No route matches {:action=>"edit", :controller=>"participations", :examination_id=>#<Participation id: 12, user_id: 1, examination_id: 1, payment_status: false, language_preference: "English">, id=>nil, :format=>nil} missing required keys: [:id]"

routes.rb

resources :examinations do
  resources :participations
end

考试.rb

class Examination < ActiveRecord::Base
  has_many :participations
  has_many :users, :through => :participations
end

participation.rb

class Participation < ActiveRecord::Base
  belongs_to :user
  belongs_to :examination
end

participations_controller.rb

class ParticipationsController < ApplicationController

  before_filter :authenticate_user!
  before_action :set_participation, only: [:show, :edit, :update, :destroy]

  def index
    @participations = Participation.all
  end

  def show
  end

  def new
    @participation = Participation.new
    @examination = params[:examination_id]
  end

  def edit
    @examination = params[:examination_id]
    @participation = Participation.new(participation_params)
  end

  def create
    @participation = Participation.new(participation_params)
    @participation.user = current_user

    respond_to do |format|
      if @participation.save
        redirect_to(@examination)
        format.html { redirect_to @participation, notice: 'Sınav Katılımınız Oluşturuldu!' }
      else
        render 'new'
        format.html { render action: 'new' }
      end
    end
  end

  def update
    respond_to do |format|
      if @participation.update(participation_params)
        format.html { redirect_to @participation, notice: 'Participation was successfully updated.' }
      else
        format.html { render action: 'edit' }
      end
    end
  end

  def destroy
    @participation.destroy
    respond_to do |format|
      format.html { redirect_to participations_url }
    end
  end

  private
    def set_participation
      @participation = Participation.find(params[:id])
    end

    def participation_params
      params.require(:participation).permit(:user_id, :examination_id, :payment_status, :language_preference, :exam_center_preference, :disability)
    end
end

app/views/participations/new.html.erb

<%= simple_form_for @participation, as: :participation, url: new_examination_participation_path(@examination) do |f| %>
    <%= f.input :user_id, :as => :hidden, :input_html => { :value => current_user.id } %>
    <%= f.input :examination_id, as: :hidden %>
    <%= f.input :language_preference, collection: ["English", "German"] %>
    <%= f.button :submit, "Register to Exam" %>
<% end %>

app/views/participations/edit.html.erb

<%= simple_form_for @participation, as: :participation, url: edit_examination_participation_path(@examination) do |f| %>
    <%= f.input :user_id, :as => :hidden, :input_html => { :value => current_user.id } %>
    <%= f.input :examination_id, as: :hidden %>
    <%= f.input :language_preference, collection: ["English", "German"] %>
    <%= f.button :submit, "Register to Exam" %>
<% end %>

app/views/participations/index.html.erb

** 导致应用程序出错的链接。

<%= link_to 'Edit', edit_examination_participation_path(participation), :class => 'btn btn-small' %>
<%= link_to 'Delete', participation, method: :delete, data: { confirm: 'bla bla' }, :class => 'btn btn-small btn-danger' %>

【问题讨论】:

  • 当您发布有关路线的问题时,请确保添加您的 rake 路线输出

标签: ruby-on-rails ruby-on-rails-4


【解决方案1】:

创建参与:

在app/views/participations/new.html.erb,

替换

<%= simple_form_for @participation, as: :participation, url: new_examination_participation_path(@examination) do |f| %>

有

<%= simple_form_for @participation, as: :participation, url: examination_participations_path(@examination, @participation) do |f| %>

examination_participations_path 将在表单提交时将请求定向到ParticipationsController #create。这就是我认为你正在努力实现的目标 => Create a Participation

更新参与:

在app/views/participations/edit.html.erb,

替换

<%= simple_form_for @participation, as: :participation, url: edit_examination_participation_path(@examination) do |f| %>

有

<%= simple_form_for @participation, as: :participation, url: examination_participation_path(@examination, @participation) do |f| %>

examination_participation_path 将在表单提交时将请求定向到ParticipationsController #update。

列出所有参与:

在app/views/participations/index.html.erb,

替换

<%= link_to 'Edit', edit_examination_participation_path(participation), :class => 'btn btn-small' %>
<%= link_to 'Delete', participation, method: :delete, data: { confirm: 'bla bla' }, :class => 'btn btn-small btn-danger' %>

有

<%= link_to 'Edit', edit_examination_participation_path(@examination, participation), :class => 'btn btn-small' %>
<%= link_to 'Delete', examination_participation_path(@examination, participation), method: :delete, data: { confirm: 'bla bla' }, :class => 'btn btn-small btn-danger' %>

注意:我强烈建议您阅读 Rails 指南中的 Nested Resources。 您可以随时使用rake routes 并查看可供您使用的路线列表。

【讨论】:

    猜你喜欢
    • 2012-01-14
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多