【问题标题】:Show view is the same for all my linked_to items listed in the index view显示视图对于我在索引视图中列出的所有linked_to 项目都是相同的
【发布时间】:2014-07-11 08:47:34
【问题描述】:

我正在开发一个包含许多项目的网站。然后每个项目都有许多项目更新。每个特定项目的项目更新都显示在一个索引视图中,该视图从每个列出的项目更新链接到其单独的项目更新显示页面。

现在的问题是,在项目更新索引页面上,无论我单击哪个项目,都会将我带到第一个项目更新的显示视图。为什么它没有将我带到相应的项目更新显示视图?

我有一个这样的索引视图:

    <%= provide(:title, 'All Project Updates') %>

        <div class="row">
            <div class="container">
                       </br>

                      <% @projectUpdates.each do |projectUpdate| %>

                      <div class="update-listing">
                          <div><%= projectUpdate.featured_image %></div>
                          <div><%= link_to projectUpdate.title, project_update_path %></div>
                          <div><%= projectUpdate.description %></div>
                        </br>
                        </br>
                      </div>

                      <% end %>

            </div>
        </div>
<% end %>

这是我的表演视图:

<%= provide(:title, @projectUpdate.project.npo.name+"Updates | "+@projectUpdate.project.name) %> 
<br />

<div class="row">
    <div class="small-12 columns">
    <h1><%= @projectUpdate.project.npo.name+"Updates | "+@projectUpdate.project.name %></h1>
    <hr />
    </div>
    <div class="small-12 medium-7 large-8 columns">

            <div class="random-text">
                        <%= @projectUpdate.title %></br>
                        <%= @projectUpdate.description %></br>

                <% if false %> <%= image_tag @projectUpdate.project_image %> 
                <%= link_to project_update_path(@projectUpdate) %><% end %>
                </br>
            </div>
            <div>
                <%= link_to "Back", :back, class:"btn btn-default return-project-button" %>
                <% if can? :manage, @projectUpdate.project %>
                <%= link_to 'Edit', edit_project_update_path(@projectUpdate), class:"btn btn-default edit-update-button" %> 
                <%= link_to 'Delete', @projectUpdate, class:"btn btn-default delete-update-button", method: :delete, data: { confirm: 'Are you sure?' } %>
            </div>

    </div>

</div>
<% end %>

这些是我的项目更新控制器中的索引和显示操作:

def index
      @projectUpdates = ProjectUpdate.where(:project_id => params[:id])
      respond_to do |format|
         format.html
      end
   end

   def show
      @projectUpdate = ProjectUpdate.find(params[:id])
      respond_to do |format|
         format.html
      end
   end

理解代码的一些相关路径:

get 'all_project_updates/:id' => 'project_updates#index', as: 'all_project_updates'
resources :project_updates
resources :projects

我尝试过改变:

          <div><%= link_to projectUpdate.title, project_update_path %></div>

          <div><%= link_to projectUpdate.title, project_update_path(@projectUpdate) %></div>

但这导致了空白显示页面。

我对编程比较陌生,因此希望能提供一些简单的解释。

我认为我没有正确传递控制器中的参数来选择要显示的单个项目更新,但对此不确定。想法?

rake 路由输出:

                         Prefix Verb     URI Pattern
Controller#Action
               new_user_session GET      /users/sign_in(.:format)
users/sessions#new
                   user_session POST     /users/sign_in(.:format)
users/sessions#create
           destroy_user_session DELETE   /users/sign_out(.:format)
users/sessions#destroy
        user_omniauth_authorize GET|POST /users/auth/:provider(.:format)
users/omniauth_callbacks#passthru {:provider=>/facebook/}
         user_omniauth_callback GET|POST /users/auth/:action/callback(.:format
users/omniauth_callbacks#(?-mix:facebook)
                  user_password POST     /users/password(.:format)
devise/passwords#create
              new_user_password GET      /users/password/new(.:format)
devise/passwords#new
             edit_user_password GET      /users/password/edit(.:format)
devise/passwords#edit
                                PATCH    /users/password(.:format)
devise/passwords#update
                                PUT      /users/password(.:format)
devise/passwords#update
       cancel_user_registration GET      /users/cancel(.:format)
users/registrations#cancel
              user_registration POST     /users(.:format)
users/registrations#create
          new_user_registration GET      /users/sign_up(.:format)
users/registrations#new
         edit_user_registration GET      /users/edit(.:format)
users/registrations#edit
                                PATCH    /users(.:format)
users/registrations#update
                                PUT      /users(.:format)
users/registrations#update
                                DELETE   /users(.:format)
users/registrations#destroy
              user_confirmation POST     /users/confirmation(.:format)
devise/confirmations#create
          new_user_confirmation GET      /users/confirmation/new(.:format)
devise/confirmations#new
                                GET      /users/confirmation(.:format)
devise/confirmations#show
                           root GET      /
pages#home
                 login_any_user POST     /login_any_user(.:format)
users#login_redirect
                 user_dashboard GET      /users/:id/user_dashboard(.:format)
users#user_dashboard
                  user_settings GET      /users/:id/settings(.:format)
users#settings
           reactivate_user_page GET      /users/:id/reactivate(.:format)
users#reactivate
                reactivate_user POST     /users/:id/reactivate(.:format)
users#reactivate_user
                new_transaction POST     /transactions/new/:id(.:format)
transactions#new
                  npo_dashboard GET      /npos/:id/npo_dashboard(.:format)
npos#npo_dashboard
                    my_projects GET      /npos/:id/my_projects(.:format)
projects#manage_projects
                admin_dashboard GET      /admin_dashboard(.:format)
users#admin_dashboard
                          about GET      /about(.:format)
pages#about
                     howitworks GET      /howitworks(.:format)
pages#howitworks
                        contact GET      /contact(.:format)
pages#contact
                        sponsor GET      /sponsor(.:format)
pages#sponsor
                          deals GET      /deals(.:format)
pages#deals
                         refund GET      /refund(.:format)
transactions#refund
            all_project_updates GET      /all_project_updates/:id(.:format)
project_updates#index
                          pages GET      /pages(.:format)
pages#index
                                POST     /pages(.:format)
pages#create
                       new_page GET      /pages/new(.:format)
pages#new
                      edit_page GET      /pages/:id/edit(.:format)
pages#edit
                           page GET      /pages/:id(.:format)
pages#show
                                PATCH    /pages/:id(.:format)
pages#update
                                PUT      /pages/:id(.:format)
pages#update
                                DELETE   /pages/:id(.:format)
pages#destroy
                       projects GET      /projects(.:format)
projects#index
                                POST     /projects(.:format)
projects#create
                    new_project GET      /projects/new(.:format)
projects#new
                   edit_project GET      /projects/:id/edit(.:format)
projects#edit
                        project GET      /projects/:id(.:format)
projects#show
                                PATCH    /projects/:id(.:format)
projects#update
                                PUT      /projects/:id(.:format)
projects#update
                                DELETE   /projects/:id(.:format)
projects#destroy
                           npos GET      /npos(.:format)
npos#index
                                POST     /npos(.:format)
npos#create
                        new_npo GET      /npos/new(.:format)
npos#new
                       edit_npo GET      /npos/:id/edit(.:format)
npos#edit
                            npo GET      /npos/:id(.:format)
npos#show
                                PATCH    /npos/:id(.:format)
npos#update
                                PUT      /npos/:id(.:format)
npos#update
                                DELETE   /npos/:id(.:format)
npos#destroy
                   transactions GET      /transactions(.:format)
transactions#index
                                POST     /transactions(.:format)
transactions#create
                                GET      /transactions/new(.:format)
transactions#new
               edit_transaction GET      /transactions/:id/edit(.:format)
transactions#edit
                    transaction GET      /transactions/:id(.:format)
transactions#show
                                PATCH    /transactions/:id(.:format)
transactions#update
                                PUT      /transactions/:id(.:format)
transactions#update
                                DELETE   /transactions/:id(.:format)
transactions#destroy
                          users GET      /users(.:format)
users#index
                                POST     /users(.:format)
users#create
                       new_user GET      /users/new(.:format)
users#new
                      edit_user GET      /users/:id/edit(.:format)
users#edit
                           user GET      /users/:id(.:format)
users#show
                                PATCH    /users/:id(.:format)
users#update
                                PUT      /users/:id(.:format)
users#update
                                DELETE   /users/:id(.:format)
users#destroy
                     categories GET      /categories(.:format)
categories#index
                                POST     /categories(.:format)
categories#create
                   new_category GET      /categories/new(.:format)
categories#new
                  edit_category GET      /categories/:id/edit(.:format)
categories#edit
                       category GET      /categories/:id(.:format)
categories#show
                                PATCH    /categories/:id(.:format)
categories#update
                                PUT      /categories/:id(.:format)
categories#update
                                DELETE   /categories/:id(.:format)
categories#destroy
                project_updates GET      /project_updates(.:format)
project_updates#index
                                POST     /project_updates(.:format)
project_updates#create
             new_project_update GET      /project_updates/new(.:format)
project_updates#new
            edit_project_update GET      /project_updates/:id/edit(.:format)
project_updates#edit
                 project_update GET      /project_updates/:id(.:format)
project_updates#show
                                PATCH    /project_updates/:id(.:format)
project_updates#update
                                PUT      /project_updates/:id(.:format)
project_updates#update
                                DELETE   /project_updates/:id(.:format)
project_updates#destroy
                      s3_create POST     /s3/upload(.:format)
media_files#s3_create
                      s3_delete DELETE   /s3/delete/:id(.:format)
media_files#s3_delete
create_or_update_avatar_from_s3 POST     /s3/avatar(.:format)
media_files#create_or_update_avatar_from_s3
          delete_avatar_from_s3 DELETE   /s3/avatar/:id(.:format)
media_files#delete_avatar_from_s3

【问题讨论】:

  • 试试这个&lt;%= link_to projectUpdate.title, project_update_path(projectUpdate) %&gt;
  • 感谢工作!你能解释一下为什么吗?如果可能的话,我想了解实际发生的情况

标签: ruby-on-rails ruby model-view-controller ruby-on-rails-4 routing


【解决方案1】:

在你的索引中,你需要改变:

<div><%= link_to projectUpdate.title, project_update_path %></div>

到:

<div><%= link_to projectUpdate.title, project_update_path(projectUpdate) %></div>

正如您在 rake routes 输出中看到的那样,您有这一行:

project_update GET      /project_updates/:id(.:format)     project_updates#show

这意味着您有一个命名路由project_update,将/project_updates/:id(.:format) 之类的任何路径加入到ProjectUpdatedController 的显示操作中。

现在看看:/project_updates/:id(.:format)。通常,在这些路径中以冒号开头的任何内容都是参数。此外,括号中的任何内容都是可选的。因此,从这条路径来看,您可以说没有 id 就不可能构建正确的路径。

Rails 路由为您提供生成 url 的助手,它们始终命名为 &lt;name_of_your_named_route&gt;_path&lt;name_of_your_named_route&gt;_url。始终使用第一个是一个很好的做法。它的唯一目的是返回正确的路径。

project_update_path 的情况下,没有id 参数是不可能构建路径的。那些url_helpers 接受任意数量的参数,这些参数被视为参数。它们可以有一种哈希形式:

project_update_path(id: 5)    #=> /project_updates/5

纯值:

project_update_path(5)     #=> /projects_updates/5

或混合使用:

project_update_path(5, format: 'html')   #=> /projects_updates/5.html

纯值按照它们出现在路径中的顺序映射到参数:

project_update_path(5, 'html')   #=> /projects_updates/5.html

如果您传递未包含在路径中的参数,它们将被添加到 GET 查询中:

project_update_path(5, 'html', foo: 'bar')   #=> /projects_updates/5.html?foo=bar

如果这还不够,rails 足够聪明地接受 ActiveRecord 对象作为参数。然后它将在该对象上执行to_path 方法并使用它。 to_param 的默认实现是返回模型的 id,因此你可以这样做:

project_update = ProjectUpdate.find(5) 
project_update_path(project_update)   #=> /projects_updates/5

【讨论】:

  • 感谢工作!你能解释一下为什么吗?如果可能的话,我想了解实际发生的情况
  • 我会的,但我还有一个未知数。您能否使用rake routes 的输出更新您的问题(我希望您的代码会引发异常)
  • 您想在更改之前或之后查看 rake 路由输出吗?还是两者兼而有之?
  • @user3597950 - 上述更改不会改变rake routes的输出
  • 嗯,没有例外。只显示所有路线。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多