Ruby on rails 如何在Rails中创建自定义方法?

Ruby on rails 如何在Rails中创建自定义方法?,ruby-on-rails,methods,Ruby On Rails,Methods,我目前正在尝试在Rails中使用自定义方法,但我不知道如何做到这一点。除了控制器中的默认方法外,我还想添加以下内容: def cancel @newsletter = Newsletter.find(params[:id]) respond_to do |format| #SendGrid Newsletter API - Delete Newsletter Schedule SendGrid.delete_schedule(@newsletter.name)

我目前正在尝试在Rails中使用自定义方法,但我不知道如何做到这一点。除了控制器中的默认方法外,我还想添加以下内容:

  def cancel
    @newsletter = Newsletter.find(params[:id])

   respond_to do |format|

  #SendGrid Newsletter API - Delete Newsletter Schedule
  SendGrid.delete_schedule(@newsletter.name)

  @newsletter.status = "CANCELLED"

  @newsletter.save

  format.html { redirect_to newsletters_url }
  format.json { head :no_content }
end
<% @newsletters.each do |newsletter| %>
  <tr>
    <td><%= newsletter.identity %></td>
    <td><%= newsletter.name %></td>
    <td><%= newsletter.recipients %></td>
    <td><%= newsletter.subject %></td>
    <td><%= newsletter.html %></td>
    <td><%= newsletter.text %></td>
    <td><%= newsletter.schedule %></td>
    <td><%= newsletter.status %></td>
    <td><%= link_to 'Show', newsletter %></td>
    <td><%= link_to 'Edit', edit_newsletter_path(newsletter) %></td>
    <td><%= link_to 'Destroy', newsletter, method: :delete, data: { confirm: 'Are you sure?' } %></td>
    <td><% if newsletter.status == "SCHEDULED" %><%= link_to 'Cancel', newsletter, method: :cancel, data: { confirm: 'Cancel Schedule?' }%><% end %></td>

  </tr>
<% end %>
结束

该方法与默认方法类似:destroy方法,但实际上并不销毁对象

在我看来,我有以下几点:

  def cancel
    @newsletter = Newsletter.find(params[:id])

   respond_to do |format|

  #SendGrid Newsletter API - Delete Newsletter Schedule
  SendGrid.delete_schedule(@newsletter.name)

  @newsletter.status = "CANCELLED"

  @newsletter.save

  format.html { redirect_to newsletters_url }
  format.json { head :no_content }
end
<% @newsletters.each do |newsletter| %>
  <tr>
    <td><%= newsletter.identity %></td>
    <td><%= newsletter.name %></td>
    <td><%= newsletter.recipients %></td>
    <td><%= newsletter.subject %></td>
    <td><%= newsletter.html %></td>
    <td><%= newsletter.text %></td>
    <td><%= newsletter.schedule %></td>
    <td><%= newsletter.status %></td>
    <td><%= link_to 'Show', newsletter %></td>
    <td><%= link_to 'Edit', edit_newsletter_path(newsletter) %></td>
    <td><%= link_to 'Destroy', newsletter, method: :delete, data: { confirm: 'Are you sure?' } %></td>
    <td><% if newsletter.status == "SCHEDULED" %><%= link_to 'Cancel', newsletter, method: :cancel, data: { confirm: 'Cancel Schedule?' }%><% end %></td>

  </tr>
<% end %>
通讯(u controller.rb) def取消 @新闻稿=新闻稿.查找(参数[:id])

通讯/index.html.erb
以下是有关路由的完整说明:

以下是有关路由的完整说明:

config/routes.rb
文件中应该有这样一行

resources :newsletters
你会想把它改成这个

resources :newsletters do
  member do
    put 'cancel'
  end
end

您将想看看张贴的路线指南。您还需要了解基本的restful路由,以及Rails如何处理GET、POST、PUT、DELETE等。

您的
config/routes.rb文件中应该有这样一行代码

resources :newsletters
你会想把它改成这个

resources :newsletters do
  member do
    put 'cancel'
  end
end

您将想看看张贴的路线指南。您还需要了解基本的restful路由,以及Rails如何处理GET、POST、PUT、DELETE等。

我认为您将
链接中的
方法:
参数误认为与控制器中的方法相对应。实际上,它指的是RESTfulHTTP动词,即:post、:delete和:put。因此,您不会通过这种方式传递控制器操作

相反,您可以传入:controller和:action参数

最好还是在routes.rb中创建一条路由,并使用rails生成的路径

match "/cancel/:id", to: "controller#cancel", as: :cancel
然后链接到将是这样的:

link_to 'Cancel', cancel_path(newsletter)
更新: 您得到的错误是在cancel方法(在控制器中)中重定向到。将新闻稿url改为
新闻稿路径(@newsletter)

如果要重定向回单个新闻稿的显示页面,则需要执行上述操作(在此处输入@newsletter参数),如果要返回新闻稿索引页面,则它将是
新闻稿\u路径

您可以通过在终端中键入
rake routes
来检查路由的存在。你会在那里看到所有的路线名称

更改为
重定向到新闻稿路径(@newsletter)
后,您是否仍会遇到错误


有一点不太正确那就是,您正在定义一个无POST路由-它通常指向格式错误的
表单。检查与新闻稿相关的表单,尤其是那些没有为@newsletter do | f |
执行常规的
表单的表单。我认为您将
链接到的
中的
方法:
参数误认为与控制器中的方法相对应。实际上,它指的是RESTfulHTTP动词,即:post、:delete和:put。因此,您不会通过这种方式传递控制器操作

相反,您可以传入:controller和:action参数

最好还是在routes.rb中创建一条路由,并使用rails生成的路径

match "/cancel/:id", to: "controller#cancel", as: :cancel
然后链接到将是这样的:

link_to 'Cancel', cancel_path(newsletter)
更新: 您得到的错误是在cancel方法(在控制器中)中重定向到。将新闻稿url改为
新闻稿路径(@newsletter)

如果要重定向回单个新闻稿的显示页面,则需要执行上述操作(在此处输入@newsletter参数),如果要返回新闻稿索引页面,则它将是
新闻稿\u路径

您可以通过在终端中键入
rake routes
来检查路由的存在。你会在那里看到所有的路线名称

更改为
重定向到新闻稿路径(@newsletter)
后,您是否仍会遇到错误


有一点不太正确那就是,您正在定义一个无POST路由-它通常指向格式错误的
表单。检查与新闻稿相关的表单,尤其是那些没有为@newsletter do | f |
执行常规
表单的表单。我这样做了,但显示了相同的错误:X我需要更改routes.rb文件之外的任何内容吗?我这样做了,但显示了相同的错误:X我需要更改routes.rb文件之外的任何内容吗?谢谢很多!这很有道理。现在真的明白代码的意思了!但是,我仍然无法让代码正常工作。我仍然遇到相同的错误,即没有路由匹配:(还有什么我需要编辑的吗?当你试图查看查看页面时,或者当你单击取消链接时,你是否会出现错误?我还假设,除了你设置的取消路线外,你的routes.rb文件中还有一个新闻稿资源。请发布你修改的代码。我在单击取消链接时出现错误。以下是新闻稿资源:资源:新闻稿确实匹配“/cancel/:id”到:“新闻稿#cancel”,as::cancel End请检查我更新的答案。修复控制器中重定向到的参数。请参考顶部我更新的qn,查看我的代码是否有任何问题:/谢谢!这很有道理。现在真的理解了代码的含义!但是,我仍然无法使代码正常工作。我仍然有相同的错误或没有路由匹配:(还有什么我需要编辑的吗?当你试图查看查看页面时,或者当你单击取消链接时,你是否会出现错误?我还假设,除了你设置的取消路线外,你的routes.rb文件中还有一个新闻稿资源。请发布你修改的代码。我在单击取消链接时出现错误。以下是新闻稿资源:资源:新闻稿确实匹配“/cancel/:id”到:“新闻稿#cancel”,as::cancel end请检查我的更新答案。修复c中重定向到的参数