2017-02-27 109 views
1

在我网站的主页上有一个链接“获取随机故事”<a href="#" class="btn-get-random-post">Get Random Story</a>,点击我需要从数据库中随机发布并在同一个窗口中显示。 我使用Laravel 5.4。Laravel 5随机发帖

class PostsController extends Controller 
{ 

public function index() { 
    return redirect('/'); 
} 

public function show($id) { 
    $post = Post::findOrFail($id); 
    return view('posts.show', compact('post')); 
} 

public function getRandomPost() { 
    $post = Post::inRandomOrder()->first(); 
    return view('posts.show', compact('post')); 
} 
} 

路线

Route::get('posts', '[email protected]'); 
Route::get('posts/create', '[email protected]'); 
Route::get('posts/{id}', '[email protected]'); 
Route::post('posts', '[email protected]'); 
Route::post('publish', '[email protected]'); 
Route::post('delete', '[email protected]'); 
Route::post('get-random-post', '[email protected]'); 

JS

$(document).ready(function() { 
$.ajaxSetup({ 
    headers: { 
     'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') 
    } 
}); 

$('.btn-get-random-post').on('click', function(){ 

    $.ajax({ 
     type: 'post', 
     url: './get-random-post',    
     error: function(jqXHR, textStatus, errorThrown) { 
      console.log(JSON.stringify(jqXHR)); 
      console.log("AJAX error: " + textStatus + ' : ' + errorThrown); 
     } 
    }); 
    return false; 
}); 

}); 

而且我有2个问题在这里
1.方法getRandomPost()返回岗位,但如何显示呢?我想要得到结果页面的网址mysite/post/{id}像来自方法show的网址。
2.是否有任何方式获取并显示随机帖子(与网址mysite/post/{id})没有AJAX?

UPD
控制器

class PostsController extends Controller 
{ 


public function index() { 
    return redirect('/'); 
} 

public function show($id) { 
    $post = Post::findOrFail($id); 
    return view('posts.show', compact('post')); 
} 

public function getRandomPost() { 
    $post = Post::inRandomOrder()->first(); 
    return redirect()->route('posts.show', ["id" => $post->id]); 
} 
} 

主页上的链接 <a href="{{ action('[email protected]') }}">Random Story</a>

路线

Route::get('/', '[email protected]'); 

Route::get('posts', '[email protected]'); 
Route::get('posts/create', '[email protected]'); 
Route::get('posts/{id}', '[email protected]')->name('posts.show'); 
Route::post('posts', '[email protected]'); 
Route::post('publish', '[email protected]'); 
Route::post('delete', '[email protected]'); 
Route::post('get-random-post', '[email protected]'); 
Route::post('dashboard/delete', '[email protected]'); 
Route::post('dashboard/unpublish', '[email protected]'); 
Route::post('dashboard/restore', '[email protected]'); 

错误 enter image description here

+0

该方法不允许错误通常指的是您在控制器上使用无效方法的情况,例如使用post调用get方法。看到你的路由定义,情况就是这样。更改get-random-post为GET – zedling

回答

1

肯定的是,如果不是在getRandomPost 返回返回视图重定向响应路线

但首先,

你似乎并没有把分配的名称你的路线。

变化Route::get('posts/{id}', '[email protected]');Route::get('posts/{id}', '[email protected]')->name('posts.show');

此外,您可能要指定一个名称的随机布线后也一样,你就可以生成视图网址,它

这样,您就能够为它生成路由。

return redirect()->route('posts.show', ["id" => $post->id]);

这一切后,你可以只使用一个链路上的路径,或点击一个按钮到路由后重定向页面:get-random-post

没有AJAX需要。

+0

这是行不通的,因为他使用ajax – Jerodev

+0

加载响应,这是他想避免的(AJAX) – zedling

+0

我试过使用你的答案,但在这种情况下,我得到错误和重定向不起作用(我更新了我的问题并添加了代码和屏幕截图)。我究竟做错了什么? – Heidel

1

您也可以通过将url更改为mysite/post来完全避免使用javascript。如果有一个ID,路线显示,如果没有,路由到getRandomPost()方法。

+0

那个问题就是在这种情况下url只会留下'mysite/get-random-post';重定向是必须的 – zedling

+0

对不起,我的意思是评论回复你的答案。正在增加你最初的说法。 –