логическая ошибка с веб-приложением блога, использующим игровую среду - PullRequest
2 голосов
/ 09 марта 2012

Я создаю простое веб-приложение для блога, использующее игровую среду, в которой есть определенные категории, и пользователи могут публиковать сообщения в нужной категории, однако проблема заключается в том, что когда я публикую в одной категории, сообщение публикуется также во всех категориях..

Application code:
    import java.util.*;
    import models.*;
    public class Application extends Controller {
        public static void index() {
            List Posts = Post.find ("order by type desc").fetch();
            render(Posts); 
        }
        public static void addpost (String content) {
            Post post = new Post(content).save();

            renderJSON(content);
html code:                 
<h2>
        CollabBlog
    </h2>
#{extends 'main.html' /}
#{set title:'Home' /}
<head>
        <title>#{get 'title' /}</title>     
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <link rel="stylesheet" type="text/css" media="screen" 
            href="@{'/public/stylesheets/categories.css'}" />        
    </head> 
<h3>Category: Health</h3>
#{ifnot Posts} 
    No posts to view
#{/ifnot}
<ul>
    #{list items:Posts, as: 'Post'}
    <li>        
        <p>${Post.poster}</p><p>${Post.content}</p>        
    </li>
    #{/list}
</ul>
<p>
    <a id="addpost" href="#">add new Health's post</a>    
</p>
<h3>Category: Politics</h3>
#{ifnot Posts} 
    No posts to view
#{/ifnot}
<ul>
    #{list items:Posts, as: 'Post'}
    <li>        
        <p>${Post.poster}:</p><p>${Post.content}</p>        
    </li>
    #{/list}
</ul>
<p>
    <a id="addpost" href="#">add new Politic's post</a>    
</p>
<h3>Category: Entertainment</h3>
#{ifnot Posts} 
    No posts to view
#{/ifnot}
<ul>
    #{list items:Posts, as: 'Post'}
    <li>        
        <p>${Post.poster}</p><p>${Post.content}</p>        
    </li>
    #{/list}
</ul>
<p>
    <a id="addpost" href="#">add new Entertainment's post</a>    
</p>
<body>
    <link href="index.css" rel="stylesheet" type="text/css">
</body>
<script type="text/javascript" charset="utf-8">
$('#addpost').click(function() {
    $.post('@{addpost()}', {content: prompt('post content ?')}, function(Post){
        $('ul').prepend()
    })
    $.post('@{addpost()}', {poster : prompt('which category ?')}, function(Post){
        $('ul').prepend()
    })   
})
</script>                
            }


        }

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

1 Ответ

1 голос
/ 09 марта 2012

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

Map<String, List<Post>> map = new HashMap<String, List<Post>>();
// the categories variable here is the unique types from the Post table
for (String category : categories) {
    List<Post> posts = Post.find("type = ?", category).fetch();
    map.put(category, posts);
}
render(map);

И затем, по вашему мнению, вы можете просмотреть ключи карты, которые будут представлять все имена категорий, а затем вы получите значение, связанное с ключом, и переберите сообщения для этой категории.

Выше предполагается, что пользователь может вводить все, что он хочет. Если вы действительно хотите, чтобы они выбирали либо «Здоровье», «Политика» и «Развлечения» в соответствии с вашим примером просмотра в исходном сообщении, то, возможно, вам нужно смоделировать категории в базе данных. Некоторые варианты могут быть:

Первый вариант

Вы можете иметь две сущности: (1) Почта и (2) Категория. Первый у вас есть. Второе вам нужно будет создать. Поэтому создайте объект категории следующим образом:

@Entity
public class Category extends Model {

    @OneToMany(mappedBy = "category", targetEntity = Post.class)
    public List<Post> posts;

    ...
}

Тогда в вашей сущности Post вы можете установить связь между сущностями Post и Category следующим образом:

@Entity
public class Post extends Model {

    @ManyToOne
    @JoinColumn(name = "category_id")
    public Category category;

    ...
}

Это было бы хорошо, если бы пользователь (или вы) могли создавать категории динамически (или непосредственно в базе данных), чтобы позволить пользователям выбирать предварительно определенные категории.

Второй вариант

Если приведенный выше пример излишний, потому что категория - это просто слово и не имеет других свойств, таких как description, тогда вы можете просто использовать enum для категории:

public class Post extends Model {

    @Enumerated(EnumType.STRING)
    public Category category;

    ...
}

Где Category - это перечисление, подобное этому:

public enum Category {
    HEALTH,
    ENTERTAINMENT,
    POLITICS
}

Опять же, эта опция означает, что пользователь будет выбирать из предварительно определенного списка.

...