【问题标题】:How to link_to a show page from another MVC?如何从另一个 MVC 链接到显示页面?
【发布时间】:2015-06-03 18:07:30
【问题描述】:

当我拉起http://0.0.0.0:3000/activities 时出现此错误:

ActiveRecord::RecordNotFound in ActivitiesController#index 不能 使用 'id'= 查找估值 线路:@valuation = Valuation.find(params[:id])

activities_controller

def index
  @activities = Activity.order("created_at desc").paginate(:page => params[:page])
  @valuation = Valuation.find(params[:id])
end

活动/索引

<% @activities.each do |activity| %>
  <%= render "activities/#{activity.trackable_type.underscore}/#{activity.action}", activity: activity %>
<% end %>

活动/评估/_create

added value
  <%= activity.created_at.strftime('%B %d at %l:%M%P') %>
  <%= link_to activity.trackable.name, valuation_path(@valuation) %> #Trying to Fix This

我们的目标是,当用户查看活动提要时,他们可以点击活动并被引导到相应评估的显示页面,他们可以在该页面上点赞或评论。

路线

resources :activities do
  resources :valuations
end

如果您需要任何进一步的解释或代码来帮助我,请告诉我,否则这里是 gist of it :)

development.log

    Started GET "/activities" for 127.0.0.1 at 2015-06-03 14:14:49 -0400
Processing by ActivitiesController#index as HTML
  [1m[35mUser Load (0.2ms)[0m  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 1]]
  [1m[36mHabit Load (0.1ms)[0m  [1mSELECT "habits".* FROM "habits" WHERE "habits"."user_id" = ?[0m  [["user_id", 1]]
  [1m[35mActsAsTaggableOn::Tag Load (0.2ms)[0m  SELECT "tags".* FROM "tags" WHERE (LOWER(name) = LOWER('ingrain'))
  [1m[36mCACHE (0.0ms)[0m  [1mSELECT "habits".* FROM "habits" WHERE "habits"."user_id" = ?[0m  [["user_id", 1]]
  [1m[35m (0.1ms)[0m  SELECT COUNT(*) FROM "habits" WHERE "habits"."user_id" = ?  [["user_id", 1]]
  [1m[36mValuation Load (0.1ms)[0m  [1mSELECT  "valuations".* FROM "valuations" WHERE "valuations"."id" = ? LIMIT 1[0m  [["id", nil]]
Completed 404 Not Found in 11ms

ActiveRecord::RecordNotFound (Couldn't find Valuation with 'id'=):
  app/controllers/activities_controller.rb:4:in `index'


  Rendered /Users/galli01anthony/.rvm/gems/ruby-2.1.3/gems/actionpack-4.2.0.rc3/lib/action_dispatch/middleware/templates/rescues/_source.erb (9.3ms)
  Rendered /Users/galli01anthony/.rvm/gems/ruby-2.1.3/gems/actionpack-4.2.0.rc3/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (5.2ms)
  Rendered /Users/galli01anthony/.rvm/gems/ruby-2.1.3/gems/actionpack-4.2.0.rc3/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (1.6ms)
  Rendered /Users/galli01anthony/.rvm/gems/ruby-2.1.3/gems/actionpack-4.2.0.rc3/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout (126.4ms)


Started GET "/activities" for 127.0.0.1 at 2015-06-03 14:14:50 -0400
Processing by ActivitiesController#index as HTML
  [1m[35mUser Load (0.2ms)[0m  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 1]]
  [1m[36mHabit Load (0.1ms)[0m  [1mSELECT "habits".* FROM "habits" WHERE "habits"."user_id" = ?[0m  [["user_id", 1]]
  [1m[35mActsAsTaggableOn::Tag Load (0.2ms)[0m  SELECT "tags".* FROM "tags" WHERE (LOWER(name) = LOWER('ingrain'))
  [1m[36mCACHE (0.0ms)[0m  [1mSELECT "habits".* FROM "habits" WHERE "habits"."user_id" = ?[0m  [["user_id", 1]]
  [1m[35m (0.1ms)[0m  SELECT COUNT(*) FROM "habits" WHERE "habits"."user_id" = ?  [["user_id", 1]]
  [1m[36mValuation Load (0.1ms)[0m  [1mSELECT  "valuations".* FROM "valuations" WHERE "valuations"."id" = ? LIMIT 1[0m  [["id", nil]]
Completed 404 Not Found in 8ms

ActiveRecord::RecordNotFound (Couldn't find Valuation with 'id'=):
  app/controllers/activities_controller.rb:4:in `index'


  Rendered /Users/galli01anthony/.rvm/gems/ruby-2.1.3/gems/actionpack-4.2.0.rc3/lib/action_dispatch/middleware/templates/rescues/_source.erb (9.0ms)
  Rendered /Users/galli01anthony/.rvm/gems/ruby-2.1.3/gems/actionpack-4.2.0.rc3/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (3.6ms)
  Rendered /Users/galli01anthony/.rvm/gems/ruby-2.1.3/gems/actionpack-4.2.0.rc3/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (1.2ms)
  Rendered /Users/galli01anthony/.rvm/gems/ruby-2.1.3/gems/actionpack-4.2.0.rc3/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout (35.2ms)

【问题讨论】:

  • 先生.. 从控制台显示 rails development.log 文件内容
  • 如何将“valuation_path(@valuation)”更改为“valuation_path(@valuation.id)”。您将整个 @valuation 作为参数传递。
  • 这个路径错误..显示rake routes的结果。
  • @AnthonyGalli.com 你的路径应该像this answer
  • 如果我离开活动索引@valuation = Valuation.find(params[:id]) 我仍然会得到同样的错误@Hugo。如果我把它拿出来,那会给我undefined method id' for nil:NilClass`

标签: ruby-on-rails ruby model-view-controller feed link-to


【解决方案1】:

使用我了解您需要的代码链接到您的显示页面

  1. resources :activities do resources :valuations end
  2. 因为它是多态性的,所以使用 trackable 来查找 id 并放入行:&lt;%= link_to activity.trackable.name, activity_valuation_path(activity, activity.trackable_id) %&gt;
  3. 从索引中删除这一行:@valuation = Valuation.find(params[:id])

希望对您有所帮助!

【讨论】:

    【解决方案2】:

    你有嵌套资源:

    resources :activities do
      resources :valuations
    end
    

    这不会创建方法

    估值路径()

    它创造

    activities_valuation_path()

    如果您想创建需要重构的估值路径:

    resources :activities do
      resources :valuations
    end
    resources :valuations            # this will create your method
    

    或者如果估值与我建议使用的活动密切相关

    activities_valuation_path(:activity_id, :valuation_id)

    【讨论】:

      猜你喜欢
      • 2016-03-24
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      • 2014-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多