2016-08-21 2 views
2

Это мое первое реальное приложение, которое я создаю и развертываю. Я бегу на Ruby 2.2.4p230 & Rails 4.2.5.1. Поэтому у меня есть статические страницы high_voltage для основных страниц моих приложений, которые в основном статичны, и я хотел бы, чтобы они извлекали фрагменты контента из базы данных. Эти фрагменты будут использоваться на нескольких страницах или для добавления подсказок к функциям приложений.Сделать Rails процесс HTML из базы данных

Я также создал Page модель с помощью:

rails g model Page name:string content:text 

Чтобы увидеть, если я мог бы получить что-нибудь, чтобы вынести из моего Pages стола, я тогда пытался использовать:

<%= raw @page.content %> 

я получил все это следующим образом: How to have Rails Views process HTML tags from database content?

При этом возникает следующая ошибка:

undefined method `content' for nil:NilClass 

Я попытался добавить:

# app/models/page.rb 
def pageParams 
    params.require(:content).permit(:content, :name, :id, :created_at, :updated_at) 
end 

Это до сих пор не дали мне ничего. Как я уже сказал, я очень новичок в рельсах, так как это мое первое истинное приложение, которое я планирую ввести в производство. Я пробовал много других способов получить html для рендеринга туда безрезультатно. Большинство методов я нахожу больше не работать на Rails 4.2.5.1

Как это должно быть сделано с высоким напряжением

#app/controller/Pages_Controller.rb 
class PagesController < ApplicationController 
PageIndex = Page.find_by_name('index').content 
end 

Тогда в High Voltage представление должно содержать:

<%= PagesController::PageIndex %> 

Вы должны использовать Pages_Controller для вызова их в High_Voltage. Я попытался поместить этот же код в контроллер приложения, Application Helper, и он продолжал говорить High_Voltage NoMethodError. Как только я поместил код в # app/controller/Pages_Controller.rb, он работал отлично. Вот почему я отдал должное правильному ответу на Ven. Вен показал мне правильный способ сделать это. Но я сделал еще один шаг и решил сделать постоянную, а не глобальную переменную. Ответ Стива также правилен и первоначально дал ему кредит, пока я не получил ответ Vens, который является правильным методом для этого, согласно всем документам Rails. Стив предоставил мне полезное обходное решение, которое отлично работает.

+0

Вы можете явно получить запись ... '<% = raw Page.first.content%>' или '<% = raw Page.find_by (name:" my_page "). Content%>' – SteveTurczyn

+0

Thak you so много. Я знал, что мне не хватает чего-то простого. Теперь есть причина, по которой я не хотел бы этого делать? –

+0

@SteveTurczyn может перенаправить ваш ответ в качестве ответа, чтобы я мог дать вам кредит на это? –

ответ

0

Что вам нужно назначить @page. Приставка @ обозначает класс переменных экземпляра в Ruby, Rails и мнения разделяют переменные экземпляра со своим контроллером:

def high_voltage 
    @page = Page.find(params["post_id"]) # find a page by ?post_id= parameter 
    # Since you said you want them "static", I guess you can hardcode the name: 
    @page = Page.find_by_name("high_voltage") 
end 

Таким образом, переменная @page будет существовать, вместо того, чтобы быть nil, суть вашей ошибки.

Однако я бы рекомендовал вместо этого просто используя show действие вашего PageController (вы можете найти по имени в этом действии), если все, что ты собираешься делать это жёстко кучу действий с Page.find_by_name() в нем.

Обратите внимание, что если Page.find, вы получите 404 (.find() поднимет RecordNotFound), так что вы будете уверены, что код представления никогда не будет выполняться, если нет сообщений для отображения.


Если вы действительно хотите, чтобы отобразить страницу с другим текстом, в случае пост не был найден, вы можете использовать find_by_id:

def high_voltage 
    @post = Post.find_by_id(params["post_id"]) 
    # @post may be nil here! 
end 

А на ваш взгляд:

<% if @post %> 
    <%= @post.title %> 
<% else %> 
    The post wasn't found! 
<% end %> 

И, наконец, примечание к коду «postParams», который вы добавили:

Это механизм безопасности, позволяющий пользователю устанавливать определенные атрибуты (т. в форме «register» вы не хотите, чтобы пользовательская регистрация могла установить свое поле «admin»).

Следует, однако, помещать его в контроллер, а не в модель. И он должен использоваться при вызове .new или .create или .update_attributes в указанном контроллере (действия create и update, как правило).

+0

Хорошо, так быстрый вопрос об этом в вашей второй версии с find_by_id, на мой взгляд, вы говорите мне, чтобы я поставил на post.title, как мне сказать, какой именно контент ID я действительно хочу. Здесь меня путают, идя по этому маршруту, а не по пути Стива. –

+0

Вы можете использовать 'find_by_name (« High voltage »)', если хотите :). Но если вы создаете, например, боковая панель, петля на страницах, у вас есть идентификатор. – Ven

-1

Вы можете явно получить запись в представлении ...

<%= raw Page.first.content %> 

или

<%= raw Page.find_by(name: "my_page").content %> 
+0

не SQL в представлениях. – Ven

+0

@ven как насчет просмотров высокого уровня? Какова ваша альтернатива? – SteveTurczyn

+0

Это самый простой и простой способ. Я пробовал объявлять варуалы громко, которые уже называют sql из контроллеров (как было предложено Ven), но заканчиваются только нулем в качестве ответа. –

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