Ruby on Rails教程在show

时间:2015-10-25 10:53:57

标签: javascript ruby-on-rails ruby

当我尝试删除/销毁模型中的记录时,我正在遵循教程并遇到恼人的问题。摧毁行动似乎导致了表演行动。网上有很多信息表明它是一个javascript问题但是application.js已经包含// = require jquery_ujs和// = require jquery。
http://guides.rubyonrails.org/getting_started.html

index.html.erb

         <h1>Hello, Rails!</h1>
    <%= link_to 'My Blog', controller: 'articles' %>

    <h1>Listing articles</h1>
     <%= link_to 'New article', new_article_path %>
    <table>
      <tr>
        <th>Title</th>
        <th>Text</th>
        <th>Genre</th>
        <th>Ratings</th>
        <th colspan="3"></th>
      </tr>

      <% @articles.each do |article| %>
        <tr>
          <td><%= article.title %></td>
          <td><%= article.text %></td>
          <td><%= article.genre %></td>
          <td><%= article.ratings %></td>
          <td><%= link_to 'Show', article_path(article) %></td>
          <td><%= link_to 'Edit', edit_article_path(article) %></td>
         <td><%= link_to 'Destroy', article_path(article),
                  method: :delete,
                  data: { confirm: 'Are you sure?' } %></td>
        </tr>
      <% end %>
    </table>

    <%= link_to 'Back', articles_path %>

articles_controller.rb

class ArticlesController < ApplicationController
def index
    @articles = Article.all
end

def show
    @article = Article.find(params[:id])
end

def new
     @article = Article.new
 end

 def edit
  @article = Article.find(params[:id])
end


def create
    @article = Article.new(article_params)

    if 
    @article.save
    redirect_to @article
  else
    render 'new'
  end

end


def update
  @article = Article.find(params[:id])

  if @article.update(article_params)
    redirect_to @article
  else
    render 'edit'
  end
end

def destroy
  @article = Article.find(params[:id])
  @article.destroy

end

    private 

def article_params
    params.require(:article).permit(:title, :text, :genre, :ratings)
end
end

application.html.erb

<!DOCTYPE html>
<html>
<head>
  <title>Blog</title>
  <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => true %>
  <%= javascript_include_tag :default, 'data-turbolinks-track' => true %>

  <%= csrf_meta_tags %>
</head>
<body>

<%= yield %>

</body>
</html>

1 个答案:

答案 0 :(得分:3)

之前有这个问题......

-

这主要是因为您的应用程序/布局中没有包含JQuery UJS。

Rails通过指定一些JS来使delete方法工作,只要您点击它就可以从GET to DELETE更改请求。

destroy链接不起作用的主要原因(您的路由是show,这基本上意味着它使用GET而不是DELETE })是因为Rails没有正确翻译你的method

#app/assets/javascripts/application.js
//= require jquery
//= require jquery_ujs

#app/views/layouts/application.html.erb
<%= javascript_include_tag "application" %>

一些提示:

#app/views/articles/index.html.erb
<%= content_tag :h1, "Hello, Rails!" %>
<%= link_to 'My Blog', articles_path %>

<%= content_tag :h1, "Listing articles" %>
<%= link_to 'New article', new_article_path %>

<%  attrs = %i(title text genre ratings) %>
<%= content_tag :table do %>
   <%= content_tag :tr do %>
       <% attrs.each do |attr| %>
          <%= content_tag :th, attr.to_s.titleize %>
       <% end %>
       <%= content_tag :th, "&nbsp;", colspan: 3 %>
   <% end %>
<% end %>

 <% @articles.each do |article| %>
    <%= content_tag :tr do %>
       <% attrs.each do |attr| %>
          <%= content_tag :td, article.send(attr) %>
       <% end %>
    <% end %>
    <%= content_tag :td, link_to('Show', article) %>
    <%= content_tag :td, link_to('Edit', edit_article_path(article)) %>
    <%= content_tag :td, link_to('Destroy', article, method: :delete, data: { confirm: 'Are you sure?' } %>
  <% end %>
<% end %>

<%= link_to 'Back', articles_path %>

您根本不必使用content_tag,我发现使用它比使用vanilla HTML更好(确保支持将来的任何代码)。

另外,尽可能使用loops。很多人不必要地重复代码:

<td><%= @article.title %></td>
<td><%= @article.text %></td>
<td><%= @article.date %></td>
<td><%= @article.news %></td>

...

<% attrs = %i(title text date news) %>
<% attrs.each do |a| %>
   <td><%= @article.send a %></td>
<% end %>