2017-01-15 6 views
0

Мне нужна помощь в этом.Рельсы, ссылки на страницы

У меня есть «соперники», которые относятся к сообщениям. (у каждого поста есть разные соперники).

Я хотел был бы иметь возможность отображать соперников, когда я нажимаю на определенное сообщение.

Я не знаю, как связать маршрут. Я хотел бы иметь «сообщения» в качестве моей индексной страницы и иметь возможность нажимать на любую запись и иметь соответствующих соперников. Я добавил post_id к претендентам в качестве ссылки. Но я даже не знаю, правильно ли это делать.

Спасибо за помощь!

PS: Я не знаю, что это ничего не меняет, но я пытаюсь использовать ActiveAdmin в качестве backend и Carrierwave для загрузки изображения.

сообщений/index.html.erb

<div class="container"> 

     <div class="row"> 

      <div class="col-lg-12"> 
       <h1 class="page-header">Your poll app</h1> 
      </div> 
      <% @posts.each do |post| %> 
      <div class="col-lg-3 col-md-4 col-xs-6 thumb"> 
       <a class="thumbnail" href="#"> 
        <%= post.name %> 
        <br> 
        <%= post.id %> 
        <%= link_to "Contenders", post_contenders_path(post.id) %> 
        <img class="img-responsive" src="" alt=""> 
        <%= image_tag post.image_url %> 
        </img> 
       </a> 
      </div> 
      <% end %> 
     </div> 
</div> 

соперников/index.html.erb

class ContendersController < InheritedResources::Base 
    def index 
     @contenders = Contender.all 
    end 

    def new 
     @contender = Contender.new 
    end 

    def create 
     @contender = Contender.new(post_params) 

     if @contender.save 
      redirect_to posts_path, notice: "The contender #{@contender.name} has been uploaded." 
     else 
      render "new" 
     end 

    end 

    def destroy 
     @contender = contender.find(params[:id]) 
     @contender.destroy 
     redirect_to posts_path, notice: "The post #{@contender.name} has been deleted." 
    end 

     private 
     def post_params 
     params.require(:contender).permit(:name, :image) 
     end 

    private 

     def contender_params 
     params.require(:contender).permit(:name, :image, :post_id) 
     end 
end 

Контроллеры/contenders_controllers.rb

class ContendersController < InheritedResources::Base 
    def index 
     @contenders = Contender.all 
    end 

    def new 
     @contender = Contender.new 
    end 

    def create 
     @contender = Contender.new(post_params) 

     if @contender.save 
      redirect_to posts_path, notice: "The contender #{@contender.name} has been uploaded." 
     else 
      render "new" 
     end 

    end 

    def destroy 
     @contender = contender.find(params[:id]) 
     @contender.destroy 
     redirect_to posts_path, notice: "The post #{@contender.name} has been deleted." 
    end 

     private 
     def post_params 
     params.require(:contender).permit(:name, :image) 
     end 

    private 

     def contender_params 
     params.require(:contender).permit(:name, :image, :post_id) 
     end 
end 

контроллеры/posts_controllers.rb

class PostsController < ApplicationController 
    def index 
     @posts = Post.all 
    end 

    def new 
     @post = Post.new(params[:id]) 
    end 

    def create 
     @post = Post.new(post_params) 

     if @post.save 
      redirect_to posts_path, notice: "The post #{@post.name} has been uploaded." 
     else 
      render "new" 
     end 

    end 

    def destroy 
     @post = Post.find(params[:id]) 
     @post.destroy 
     redirect_to posts_path, notice: "The post #{@post.name} has been deleted." 
    end 

    private 
     def post_params 
     params.require(:post).permit(:name, :image) 
    end 

end 

Терминал

Started GET "/ сообщений/10/соперников" для 127.0.0.1 в 2017-01-16 20:22:16 +0000 Processing по ContendersController # индексу, как HTML- Параметры: { "post_id" => "10"} Оказание претендентов/index.html.erb в пределах макетов/приложения Претендент нагрузки (0,5 мс)
SELECT "соперники" * от «соперников. " Полученный соперник s/index.html.erb в макетах/приложении (2,8 мс) Завершено 200 OK в 177 мс (Просмотров: 172.9мс | ActiveRecord: 0.5мс)

Started GET "/" для 127.0.0.1 в 2017-01-16 20:35:30 +0000 Обработка по PostsController # индекс как HTML Rendering сообщения/index.html.erb внутри макетов/application Post Load (1.0ms)
SELECT "posts". * FROM "posts" Представленные сообщения/index.html.erb в макетах/приложении (25.3ms) Завершено 200 OK в 322ms (Просмотров: 310.8ms | ActiveRecord: 1.0ms)


Так я редактировал код. И он все еще не показывает правильные вещи.

сообщений/index.html.erb

<div class="container"> 
     <div class="row"> 
      <div class="col-lg-12"> 
       <h1 class="page-header">Your poll app</h1> 
      </div> 
      <% @posts.each do |post| %> 
      <div class="col-lg-3 col-md-4 col-xs-6 thumb"> 
       <a class="thumbnail" href="#"> 
        <%= post.name %> 
        <br> 
        <%= post.id %> 
        <%= link_to "Contenders", post_contenders_path(post_id: post.id) %> 
        <img class="img-responsive" src="" alt=""> 
        <%= image_tag post.image_url %> 
        </img> 
       </a> 
      </div> 
      <% end %> 
     </div> 
</div> 

соперников/index.html.Еврорадио

<div class="container"> 

     <div class="row"> 

      <div class="col-lg-12"> 
       <h1 class="page-header"> 
       Test 
       </h1> 
      </div> 
      <% @contenders.each do |contender| %> 
      <div class="col-lg-3 col-md-4 col-xs-6 thumb"> 
       <a class="thumbnail" href="#"> 
        <%= contender.name %> 
        <br> 
        <%= contender.post_id %> 
        <img class="img-responsive" src="" alt=""> 
        <%= image_tag contender.image_url %> 
        </img> 
       </a> 
      </div> 
      <% end %> 
     </div> 
</div> 

Контроллеры/contenders_controllers.rb

class ContendersController < InheritedResources::Base 
    def show 
     @post = Post.find_by(id: params[:post_id]) 
     @contenders = @post.contenders 
    end 

     private 
     def post_params 
     params.require(:contender).permit(:name, :image) 
     end 

    private 

     def contender_params 
     params.require(:contender).permit(:name, :image, :post_id) 
     end 
end 

Контроллеры/posts_controllers.rb

class PostsController < ApplicationController 
    def index 
     @posts = Post.all 
    end 
    def show 
     @post = Post.find_by(id: params[:post_id]) 
     @contenders = @post.contenders # Assuming that they have a has_many/belongs to relationship. 
    end 

    private 
     def post_params 
     params.require(:post).permit(:name, :image) 
    end 

end 

routes.rb

Rails.application.routes.draw do 
    resources :contenders 
    resources :users 
    devise_for :admin_users, ActiveAdmin::Devise.config 
    ActiveAdmin.routes(self) 
    # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html 
    resources :posts do 
    resources :contenders 
    end 
    root "posts#index" 

end 
+0

Вывод терминала показывает, что вы выполняете рендеринг из индекса ContenderController #. Который имеет код '@contenders = Contender.all', поэтому он отображает всех соперников. Если вы хотите его охватить, сначала найдите '@ post' с': post_id', а затем вызовите всех претендентов на этот пост. Я показываю это в моем ответе ниже в методе 'show'. Вы можете сделать то же самое в действии индекса contenders_controller, и я опубликую редактирование. Попробуйте. :-) –

+0

Привет, Джеймс, я обновил код. Но я думаю, что все еще что-то не хватает .. :( – Benjamin

+0

Является ли вывод терминала по-прежнему одним и тем же? Можете ли вы вставить новый вывод, если он отличается? Можете ли вы вставить выходные данные 'rake routes '? Также вы можете попробовать сделать маршрут на страницу показа. Подобно этому '<% = link_to post_path (post.id)%>'.Попробовали ли вы поставить @post = Post.find_by (id: params [: post_id]); @contenders = @ post.contenders' в индексе 'contenders_controller #? –

ответ

0

Если вы хотите иметь вложенную URL, то вам нужно что-то в файле маршрутов, который выглядит следующим образом:

# routes.rb 
resources :posts do 
    resources :contenders 
end 

, а затем в ваш posts_controller вы хотите, чтобы ваш метод show, чтобы иметь возможность быть индекс contenders по конкретному post, справа?

Таким образом, в методе шоу, вы бы контроллер найти пост с :post_id, а затем список претендентов на этот пост, как это:

# posts_controller.rb 
def show 
    @post = Post.find_by(id: params[:post_id]) 
    @contenders = @post.contenders # Assuming that they have a has_many/belongs to relationship. 
end 

Что касается зрения, то вы похожи вы связали его правильно. Вы можете запустить rake routes в командной строке, чтобы получить вывод маршрутов, которые ваше приложение нарисовало. Первый столбец - это список имен, которые вы можете вызвать для маршрута. В третьем столбце вы увидите URL-адрес с любой из динамических частей, написанных как :id или :post_id, это говорит вам, что вам необходимо передать эту информацию на маршрут.

Так что, если у вас есть URL, как /posts/:post_id/contenders, который будет указательный действие, вам нужно будет иметь link_to который выглядит следующим образом:

<% @posts.each do |post| %> 
    ... 
    <%= link_to 'Post', post_contenders_path(post_id: post.id) %> 
    ... 
<% end %> 

Тогда в ваших соперников показать страницу, которую вы хотите что-то вроде этого (с использованием переменной @contenders выше):

# views/contenders/show.html.erb 
... 
<% @contenders.each do |contender| %> 
    ... 
    <%= contender.name %> <!-- Or some other attribute that contender has... --> 
    ... 
<% end %> 
... 

Сообщите мне, как это получается!

EDIT:

кажется вы рендеринга contenders#index в отличие от post#show. Если вы хотите сделать это таким образом, тогда вы можете охватить действие индекса для претендентов на сообщение. Вроде так:

# controllers/contenders_controller.rb 
def index 
    @post = Post.find_by(id: params[:post_id]) 
    @contenders = @post.contenders 
end 
+0

Спасибо за ответ Джеймс, но, к сожалению, он до сих пор не работает для меня. Так что да, в принципе, я хотел бы иметь все мои сообщения на своей главной странице. И когда я нажимаю на сообщение, я хотел бы перейти на страницу соперников, связанную с сообщением. Так, например: Главная страница: Сообщение A, B, C, D и т.д. Если я нажимаю на сообщение B, я' перейти на страницу, которая показывает только соперники, связанные размещать B. Я также имея проблему, понимающую разницу между показателем и методом индекса. (У меня не было никакого метода показа). Спасибо! – Benjamin

+0

Кстати, вы использовали «link_to 'Post», я подумал, что это просто опечатка, поскольку я полагаю, что это должно быть link_to «Contenders». – Benjamin

+0

Во-первых, на странице «show» отображается только объект и любая информация, которую вы хотите отобразить об этом объекте. В этом случае мы хотим показать одну запись, и эта почта будет иметь ряд соперников, связанных с ней. Вот почему в методе 'def show ....', в post_controller, мы ограничиваем область '@ post'. Затем мы вызываем всех участников, связанных с этим сообщением, с помощью '@ post.contenders'. –

 Смежные вопросы

  • Нет связанных вопросов^_^