2010-08-27 5 views
2

Хорошо, у меня есть модель, которая очень проста:Как добавить функцию создания/редактирования моделей на страницу индекса модели?

ServiceType(id: integer, title: string, duration: integer, created_at: datetime, updated_at: datetime) 

Потому что его так просто, смешно, что я должен иметь отдельную страницу для создания и обновления этих типов записей. То, что я хотел бы сделать, это иметь форму на моей индексной странице, которую я могу использовать для создания новых записей, и если я нажму ссылку редактирования, я бы хотел, чтобы форма загружала эту запись, чтобы форма удваивалась как форма создания/обновления ,

Кто-нибудь уже сделал это раньше или кто-нибудь знает о статье в блоге, где показано, как это сделать?

EDIT: Используя ссылку блога размещенную ниже по Laheab Я на данный момент: Если вы используете Rails 3, ссылка Laheab является то, что вы хотите, но имейте в виду !! Парень, который написал его, оставил тонну очевидных ошибок в своем коде. Ищите плохие блоки комментариев, такие как */ */, а не /* */ и ищите времена, когда он использует jQuery, но оставляет за собой $.

ЕСЛИ вы используете Rails 2.3.x, я опубликовал измененную версию этого в качестве ответа.

ответ

1

Если вы работаете в Rails 2.3.x, вам необходимо изменить, что делает парень в этом blog link.

Это то, что я сделал для создания/редактирования/уничтожения (это еще не работает, оно по-прежнему отображает destroy.js.эрб как HTML по некоторым причинам), чтобы работать:

делают рельсы приложение:

$ rails post_app 
$ cd post_app 
$ script/generate scaffold Post title:string content:text 
$ rake db:migrate 

А теперь добавить/заменить следующие файлы:

общественные/JavaScripts/application.js (см эпизод Railscasts 136 http://railscasts.com/episodes/136-jquery):

// Setting up ajax for sending javascript requests 
jQuery.ajaxSetup({ 
    'beforeSend': function(xhr) {xhr.setRequestHeader("Accept", "text/javascript")} 
}); 

jQuery.fn.submitWithAjax = function() { 
    this.submit(function() { 
    $.post(this.action, $(this).serialize(), null, "script"); 
    return false; 
    }); 
    return this; 
}; 

jQuery.fn.getWithAjax = function() { 
    this.click(function() { 
    $.get(this.href, null, null, "script"); 
    return false; 
    }); 
    return this; 
}; 

jQuery.fn.postWithAjax = function() { 
    this.click(function() { 
    $.post(this.href, null, null, "script"); 
    return false; 
    }); 
    return this; 
}; 

приложение/контроллеры/posts_controller:

class PostsController < ApplicationController 
    before_filter :load 

    def load 
    @posts = Post.all 
    @post = Post.new 
    end 

    def index 
    end 

    def edit 
    @post = Post.find(params[:id]) 
    respond_to do |format| 
     format.all {render :file => "#{RAILS_ROOT}/public/404.html", :status => '404 Not Found'} 
     format.js {render :layout => false} 
    end 
    end 

    def create 
    @post = Post.new(params[:post]) 

    if @post.save 
     flash[:notice] = 'Post was successfully created.' 
     @posts = Post.all 
    end 

    respond_to do |format| 
     format.js {render :layout => false } 
    end 
    end 

    def update 
    @post = Post.find(params[:id]) 

    if @post.update_attributes(params[:post]) 
     flash[:notice] = 'Post was successfully updated.' 
     @posts = Post.all 
    end 
    respond_to do |format| 
     format.js {render :layout => false } 
    end 
    end 

    def destroy 
    @post = Post.find(params[:id]) 
    @post.destroy 
    flash[:notice] = "Successfully destroyed post." 
    @posts = Post.all 
    respond_to do |format| 
     format.js {render :layout => false } 
    end 
    end 
end 

приложение/просмотров/макеты/posts.html.erb

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
    <meta http-equiv="content-type" content="text/html;charset=UTF-8" /> 
    <title>Posts: <%= controller.action_name %></title> 
    <%= stylesheet_link_tag 'scaffold' %> 
    <%= javascript_include_tag 'http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js', 'application' %> 
    <%= javascript_include_tag 'rails' %> 
    <%= yield :head %> 
</head> 
<body> 
    <div id="container"> 
    <div id="flash_notice" style="display: none; color: green"></div> 
    <%= yield %> 
    </div> 
</body> 
</html> 

под приложение/просмотров/сообщений удалить все и добавить следующие файлы:

index.html.erb:

<%- content_for :head do -%> 
    <%= javascript_include_tag '/posts.js' %> 
<% end %> 
<h1>Listing posts</h1> 
<%= render :partial => "form" %> 
<div id="posts_list"> 
<%= render :partial => "posts" %> 
</div> 

index.js.erb:

// Setting up the ajax requests for the forms/links. 
$(document).ready(function() { 
    $("#new_post").submitWithAjax(); 
    $("a.edit").each(function(){ 
    $(this).getWithAjax(); 
    }); 
    $("a.destroy").each(function(){ 
    $(this).postWithAjax(); 
    }); 
}); 

create.js.erb:

<% if @post.errors.any? -%> 
    /*Hide the flash notice div*/ 
    $("#flash_notice").hide(300); 

    /*Update the html of the div post_errors with the new one*/ 
    $("#post_errors").html("<%= escape_javascript(error_messages_for(@post))%>"); 

    /*Show the div post_errors*/ 
    $("#post_errors").show(300); 
<% else -%> 
    /*Hide the div post_errors*/ 
    $("#post_errors").hide(300); 

    /*Update the html of the div flash_notice with the new one*/ 
    $("#flash_notice").html("<%= escape_javascript(flash[:notice])%>"); 

    /*Show the flash_notice div*/ 
    $("#flash_notice").show(300); 

    /*Clear the entire form*/ 
    $(":input:not(input[type=submit])").val(""); 

    /*Replace the html of the div post_lists with the updated new one*/ 
    $("#posts_list").html("<%= escape_javascript(render(:partial => "posts")) %>"); 
<% end -%> 

destroy.js.erb:

$("#post_errors").hide(300); 
$("#flash_notice").html("<%= escape_javascript(flash[:notice])%>"); 
$("#flash_notice").show(300); 
$("#posts_list").html("<%= escape_javascript(render(:partial => "posts")) %>"); 

_posts.erb:

<table> 
    <tr> 
    <th>Title</th> 
    <th>Content</th> 
    </tr> 
    <% for post in @posts %> 
    <tr> 
     <td><%= post.title %></td> 
     <td><%= post.content %></td> 
     <td><%= link_to "Edit", edit_post_path(post), :class => "edit" %></td> 
     <td><%= link_to "Destroy", post, :confirm => 'Are you sure?', :method => :delete, :class => 'destroy' %></td> 
    </tr> 
    <% end %> 
</table> 

edit.js.erb:

$("#new_post").html("<%= escape_javascript(render(:partial => "form"))%>"); 
$("#post_title").val('<%= escape_javascript(@post.title)%>'); 
$("#post_content").val('<%= escape_javascript(@post.content)%>'); 

_form.erb:

<% form_for @post do |f| %> 
    <div id="post_errors" style="display:none"></div> 
    <p> 
    <%= f.label :title %><br/> 
    <%= f.text_field :title %> 
    </p> 
    <p> 
    <%= f.label :content %><br/> 
    <%= f.text_area :content, :rows => 5 %> 
    </p> 
    <p><%= f.submit %></p> 
<% end %> 

update.js.erb:

<% if @post.errors.any? -%> 
    $("#flash_notice").hide(300); 
    $("#post_errors").html("<%= escape_javascript(error_messages_for(@post))%>"); 
    $("#post_errors").show(300); 
<% else -%> 
    $("#post_errors").hide(300); 
    $("#flash_notice").html("<%= escape_javascript(flash[:notice])%>"); 
    $("#flash_notice").show(300); 
    $(":input:not(input[type=submit])").val(""); 
    $("#posts_list").html("<%= escape_javascript(render(:partial => "posts")) %>"); 
<% end -%> 
1

Просто введите свою форму «новый тип обслуживания» в верхней части индекса. Это то же самое, что и в «новом» шаблоне.

Чтобы отредактировать существующие записи, вы можете рассмотреть что-то вроде in-place editing, которое раньше было частью ядра рельсов, но теперь является плагином.

+0

+1 для простого плагина, но ссылку, которая Laheab размещен очень близко к тому, что я ищу. Может быть, вы можете посмотреть мое редактирование выше и попытаться выяснить, где я ошибаюсь? Без блока 'response_to', я получаю сообщение об ошибке, но я не знаю, что там положить. Проверьте файл 'posts_controller.rb'. – DJTripleThreat

+0

Если вы просто используете 'response_to {| format | format.js} 'будет отображать шаблон для этого действия и формата. (Вам не нужно указывать такой блок, как 'format.js {render 'update',: format => 'js'}', если вам не нужно делать что-то другое или поставлять некоторые параметры. –

-1

Прежде всего, я хотел бы написать контроллер для этой модели в RESTfull образом и написать соответствующие шаблоны просмотров, используя частичные. Затем я бы предоставил частичные части формы на индексной странице. Возможно, использование AJAX облегчит ситуацию.
Этот раздел относится к компонентам и т. Д., И метод AFAIK the Rails для компонентов является частичным, но при этом управление контроллерами неплохо - задача непростая. Читайте:

В-третьих, Rails' „контроллер первый“ механизм доставки делает предположение, что существует только один кусок „логики“ на странице и остальное оформление. Мой опыт Выполнение веб-работы - это как раз наоборот. Есть обычно 3 или более штук логики на странице (динамические строк меню, окно поиска, покупки корзина, чат в реальное время, и т.д.) и с выбрать, какую часть логики сделать дифференциал «контроллер «меньше оптимального.
Дэвид Поллак

Источник: http://wiki.github.com/dpp/liftweb/about-view-first

Мне любопытно, как uberpro Rails разработчики дело остроумия эти вопросы.

+1

Извините, но этот ответ отключен -topic. Исходный вопрос не указывает, записаны ли контроллеры для REST, и нет причин думать, что это не так, поскольку значения по умолчанию Rails являются спокойными. Статический частичный - это все, что необходимо для рендеринга «нового «форма, нет необходимости в каких-либо компонентах. В этом обсуждении не рекомендуется обсуждать или сравнивать Scala Lift with Rails. Вы должны открыть свой собственный вопрос для этого, если хотите. –

+0

Прежде всего, я не сравнивал Rails с Я только дал цитату с мнением о Rails. Цитата, которая, на мой взгляд, демонстрирует возможную проблему. О REST - мое намерение состояло в том, чтобы дать четкое описание возможного способа решения t он проблема (вопрос). Я обычно пишу больше, чтобы быть хорошо понятым. Ваше мнение о частицах, компонентах Ваше мнение.Mine немного отличается :-) –

+1

Привет, Jeznet, спасибо за ваш вклад, но я не думаю, что именно здесь я собираюсь с этим. Посмотрите ссылку, которую опубликовал Laheab, и мое редактирование на этот пост. Я почти там, у меня просто проблема с тем, как я должен работать с 'response_to'. – DJTripleThreat

2
+0

+1 это полностью то, что я ищу, но его для рельсов 3. У меня есть некоторые проблемы «reply_to», возможно, вы можете посмотреть мое редактирование и посмотреть, где я ошибаюсь. – DJTripleThreat

+0

К сожалению, у меня нет версии Rails 2, поэтому я не могу ее проверить .. Я снова проверю и отредактирую. –

+0

Хорошо, большинство проблем было на самом деле из самого блога. Этот парень был супер неряшливым. Если вы заходите в его блог, посмотрите на все его ошибки (делая '*/* /' вместо '/ * * /' и оставляя '' 'при доступе к jQuery, что вызвало большинство моих проблем. Проблема с рубином заключалась в том, что мне нужен 'format.js {render: layout => false}' – DJTripleThreat

Смежные вопросы