我的应用程序上有一个名为Source的应用程序实体。该实体具有称为url的属性。
我想对我的SHOW视图进行处理。因此,我在显示视图上添加了一个按钮来调用控制器并进行此处理。
这是我的路线。rb
get '/process', to: 'sources#read', as: 'read'
这是我的控制器方法:
class SourcesController < ApplicationController
before_action :set_source, only: [:show, :edit, :update, :destroy, :read]
access all: [:index, :show, :new, :edit, :create, :update, :destroy, :read], user: :all
def read
require 'rss'
require 'open-uri'
url = @source.url
open(url) do |rss|
feed = RSS::Parser.parse(rss)
puts "Title: #{feed.channel.title}"
feed.items.each do |item|
puts "Item: #{item.title}"
puts "Link: #{item.link}"
puts "Description: #{item.description}"
end
end
render template: 'rss_reader/home'
end
当然。我的show.html.erb:
<%= button_to 'Process Source', read_path(@source), method: :get %>
<%= link_to 'Edit', edit_source_path(@source) %> |
<%= link_to 'Back', sources_path %>
</div>
当我按下“ Process Source”按钮时,它转到正确的控制器方法,但是由于以下原因而找不到对象@source:
Couldn't find Source with 'id'=
# Use callbacks to share common setup or constraints between actions.
def set_source
@source = Source.find(params[:id])
end
我在这里做错了什么?
答案 0 :(得分:2)
您正在使用read_path(@source)
来访问路线,该路线是 expected ,用于将参数id
设置为值@source.id
,但您没有< / strong>定义您的路线以支持路径中的任何参数。
我相信read
是属于Source
单个实例的动作。因此,您应该define the route on member。这样,您将可以在控制器中访问params[:id]
,并且before_action set_source
可以正常工作。
将路线定义更改为:
resources :sources, only: [...] do # Keep the `only` array just as you have now.
get '/process', to: 'sources#read', as: 'read', on: :member
end