【问题标题】:How to fix route issue in Laravel如何解决 Laravel 中的路由问题
【发布时间】:2019-01-08 16:41:19
【问题描述】:

我想使用 Laravel 进行在线测验。 两个表课程和问题相互连接,用户可以从索引页课程名称中选择该课程的测验,提交后应该转到 questions.show,所选课程的 id 也在那里传递。 但是当我尝试转到索引页面时,出现以下错误: ""未定义变量:课程(查看:C:\xampp\htdocs\bilsan\resources\views\questions\index.blade.php)""

这里是问题 index.blade:

     <form method="post" action="{{route('queations.show',$course->id)}}">
        @csrf  
        <select name="courses_id" id="courses_id" class="form-control mt-3" style="max-width:250px; margin:  auto;">
        <option>Select Courses</option>
            @foreach($courses as $course)
              <option value="{{$course->id}}">{{$course->courses_name}}</option>
            @endforeach

        </select>
  <div  class="mt-5 list-group" >
     <input type="submit" value="submit" class="btn btn-primary"  style="max-width:150px; margin: auto;">
  </div>

</form> 

问题控制器:

      public function index()
{   
    $courses =Course::all();
    return view('questions.index',compact('courses'));
}

我使用 Laravel 7 任何人都可以帮忙!

【问题讨论】:

  • 您的路线名称有拼写错误(问题应该是问题)。

标签: php database laravel


【解决方案1】:

在您的&lt;form&gt; 中,您尝试为路由操作设置course-&gt;id,但直到foreach 循环才定义course。尝试将其发布到更通用的路线(不需要course-&gt;id)或确保视图从控制器获取course


编辑:我对您的代码的建议

添加您的QuestionsController

public function store() {
    $course = Course::findOrFail(request()->course_id);
    return view('questions.show', compact('course'));
}

questions.index 视图中编辑您的表单。我修改了表单的操作,因为我不知道您的路由文件是什么样的。我假设您的控制器称为 QuestionsController。我还将select 的名称修改为course_id 而不是courses_id

<form method="post" action="{{action('QuestionsController@store')}}">
    @csrf  
    <select name="course_id" id="course_id" class="form-control mt-3" style="max-width:250px; margin:  auto;">
    <option>Select Courses</option>
        @foreach($courses as $course)
            <option value="{{$course->id}}">{{$course->courses_name}}</option>
        @endforeach
    </select>
    <div  class="mt-5 list-group" >
        <input type="submit" value="submit" class="btn btn-primary"  style="max-width:150px; margin: auto;">
    </div>
</form> 

【讨论】:

  • @DaliaNajeh 看起来您正在尝试不正确的方法,您从下拉列表中选择了哪个课程,course-&gt;id 将在您的表单帖子中发送。
  • 正如@Stormhammer 所说,处理此问题的最佳方法是指向仅在函数中接受 Request $request 的一般路线,然后您可以执行 $course = Course::findorfail ($request->courses_id)
  • 就像 Petay87 说的那样,最好的方式(在我看来)是在路线中不需要course id,而只是让它通用。然后,您使用 Petay 提供的代码查找所选课程并将其发送到您的 questions.show 视图。
  • 我将表单更改为
    ,这应该转到同一页面,但为空页面出现。
  • 你在控制器上放了一个返回来显示一个页面吗?
【解决方案2】:

表单应该像这样进入foreach循环

@foreach($courses as $course)
<form method="post" action="{{route('questions.show',$course->id)}}">
    @csrf  
    <select name="courses_id" id="courses_id" class="form-control mt-3" style="max-width:250px; margin:  auto;">
    <option>Select Courses</option>
          <option value="{{$course->id}}">{{$course->courses_name}}</option>

    </select>
    <div  class="mt-5 list-group" >
        <input type="submit" value="submit" class="btn btn-primary"  style="max-width:150px; margin: auto;">
    </div>
</form> 
@endforeach

在您的问题中,blade 不知道您的表单路由中的 $course 是什么,因为来自控制器的数据是 $courses 并且表单也应该在循环内,以便在表单操作中也定义 $course 变量。

【讨论】:

  • 虽然这可行,但它会使 SELECT 选项毫无意义,因为它只会为每门课程提供一个选项。如果您使用卡片或按钮之类的东西来选择每门课程,这会更好。
  • 这为每个选项制作下拉框和提交按钮!!
【解决方案3】:

将您的form 操作设为route('question.store', $cource-&gt;id)。表单需要提交到store方法后面跟resource在web.php中路由

<form method="post" action="{{route('queations.show',$course->id)}}">
    @csrf  
    <select name="courses_id" id="courses_id" class="form-control mt-3" style="max-width:250px; margin:  auto;">
    <option>Select Courses</option>
        @foreach($courses as $course)
          <option value="{{$course->id}}">{{$course->courses_name}}</option>
        @endforeach

    </select>
    <div  class="mt-5 list-group" >
        <input type="submit" value="submit" class="btn btn-primary"  style="max-width:150px; margin: auto;">
    </div>
</form> 

【讨论】:

  • 这与问题中的代码完全相同,并为提出问题的人提供了额外的帮助。
猜你喜欢
  • 2020-08-27
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
  • 2017-05-03
  • 1970-01-01
  • 2019-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多