2017-02-27 9 views
1

私のサイトのメインページに「Get Random Story」というリンクがあります。クリックすると、DBからランダム投稿を取得して同じウィンドウに表示する必要があります。 私は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()方法が、どのようにそれを表示するには、がありますか?私は方法showからのURLのようなURL mysite/post/{id}の結果ページとして得たいと思う。
2. AJAXなしでランダム投稿(URL mysite/post/{id})を取得して表示する方法はありますか?メインページ

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

通常、メソッドが許可されないエラーは、ポストでgetメソッドを呼び出すような、コントローラで無効なメソッドを使用している場合を指します。あなたのルート定義を見ると、これが当てはまります。get-random-postをGETに変更してください – zedling

答えて

1

getRandomPost 復帰ルート

しかし、最初に、

あなたのルートに名前を割り当てられていないようですへのリダイレクト応答にビューを返す代わりにあれば、確認してください。

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

また、あなたはあなたがそれ

ためのビューに次のことができるようになります。この方法でURLを生成することができ、あまりにもあなたのランダムポストルートに名前を割り当てることができますそれに対する経路を生成する。

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

は、すべてこの後、あなただけのリンクでルートを使用することができ、またはルートへのボタンのクリック後にリダイレクトページ:get-random-post

必要はありませんアヤックス。

+0

彼は彼が避けたいものであるajax – Jerodev

+0

(AJAX)を使ってレスポンスを読み込んでいるので、これは動作しません – zedling

+0

私はあなたの答えを使用しようとしましたが、エラーとリダイレクトは機能しません(質問を更新し、コードとスクリーンショットを追加しました)。私は間違って何をしていますか? – Heidel

1

また、URLをmysite/postに変更することで、JavaScriptを完全に回避することもできます。 idがある場合は、表示するルートを指定し、そうでない場合はgetRandomPost()メソッドにルーティングします。

+0

に変更してください。その場合、URLは' mysite/get-random-post'のままです。リダイレクトは必須です – zedling

+0

申し訳ありませんが、私はあなたの答えに返信としてコメントするつもりでした。あなたがもともと言っていたものに追加していました。 –

関連する問題