2014-11-29 4 views
0

У меня есть две модели Author and Post. Я хочу, чтобы автор мог создавать сообщения и иметь связь между этими двумя моделями. Я обычно делаю это, вставляя автора и сообщения, поэтому url будет выглядеть как author /: id/posts. В этом случае я использую params [id], чтобы найти автора, и все работает. Тем не менее, на этот раз я хочу, чтобы сообщения отображались на них отдельно, как/posts/name-of-post, и то же самое с авторами; они будут отображаться как автор/имя автора. Чтобы создать пули, я использую драгоценный камень friendly_id. У меня есть slug, работающий над автором. Однако я не могу найти способ создания сообщения и создания ассоциации.Rails: объединение двух разных моделей, когда не используются параметры [: id]

Пожалуйста, помогите мне создать запись и связать ее с автором.

Автор модели

class Author < ActiveRecord::Base 
    has_many :posts 

    validates :name, :slug, presence: true 

    extend FriendlyId 
    friendly_id :name, use: :slugged 
end 

сообщение модель

class Post < ActiveRecord::Base 
    belongs_to :author 
end 

Автор Контроллер

def new 
    @author = Author.new 
    respond_with(@author) 
end 
private 
def set_author 
    @author = Author.friendly.find(params[:id]) 
end 

def author_params 
    params.require(:author).permit(:name, :slug, :bio) 
end 

Сообщение Контроллер

def new 
    @post = Post.new 
    respond_with(@post) 
end 
def create 
    @post = Post.new(post_params) 
    @post.save 
    respond_with(@post) 
end 
private 
def set_post 
    @post = Post.find(params[:id]) 
end 

def post_params 
    params.require(:post).permit(:title, :body, :slug, :author_id) 
end 

сообщение _form (тонкий)

= form_for @post do |f| 
- if @post.errors.any? 
#error_explanation 
    h2 = "#{pluralize(@post.errors.count, "error")} prohibited this post from being saved:" 
    ul 
    - @post.errors.full_messages.each do |message| 
     li = message 

.field 
    = f.label :title 
    = f.text_field :title 
.field 
    = f.label :body 
    = f.text_area :body 
.field 
    = f.label :slug 
    = f.text_field :slug 
.field 
    = f.label :author 
    = f.text_field :author 

.actions = f.submit 'Save' 

Ассоциации работают хорошо, когда я пытаюсь их на консоли. Моя проблема заключается в том, что я не могу получить идентификатор автора, чтобы автоматически заполнить новое представление формы сообщения и создать отношения при сохранении нового сообщения.

ответ

0

Вы хотите создать сообщение так же, как и раньше. Тот факт, что вы хотите видеть сообщение отдельно, не связанное с автором, не нуждается в изменении того, как вы их создали.

Так, например, для URL /author_slug/posts/new, ваши действия контроллера может выглядеть следующим образом:

# posts_controller.rb 
def new 
    @author = Author.friendly_find(params[:author_id]) 
    @post = @author.posts.build 
end 

Затем на вашем пути анонимного posts/post-slug-from-friendly-id, вам просто нужно получить автор от должности. Что-то вроде:

# routes.rb 
get 'posts/:post_slug', to: posts#anonymous_show 

# posts_controller.rb 
def anonymous_show 
    @post = Post.friendly_find(params[:post_slug]) 
    @author = @post.author 
end 
+0

Благодарим за отзыв. Я пытаюсь не показывать автора по URL-адресу, когда люди обращаются к блогу. Если я это сделаю, params [: author_id] равен нулю, и я не могу найти сообщения, связанные с этим автором. Как я могу получить сообщение для этого автора без author_id по параметрам? – DJF

+0

После того, как запись блога или сообщения будет сохранена с идентификатором автора на нем, вы можете получить автора из этой записи. См. Обновленный код. – steel

+0

Это работает! Благодаря!!!! – DJF