Ruby on Rails中的“显示”视图上的“正在处理”按钮

时间:2018-07-18 13:00:01

标签: ruby-on-rails ruby

我的应用程序上有一个名为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

我在这里做错了什么?

1 个答案:

答案 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