React.js和Rails模型之间的通信

时间:2016-05-16 07:07:54

标签: ruby-on-rails json reactjs react-rails

我想做什么?

我不想在我的rails上显示使用我的rails模型中的react.js组件查看文件数据。

我拥有什么?

我已经安装了这些宝石

rails-admin
react-rails 

我做了什么?

我创建了一个新的rails项目。 我安装了react-rails gem和rails-admin gem 创建了具有以下类型的新控制器

rails g scaffold帖子标题:字符串正文:文字

我可以从rails admin帖子中添加所有内容。

我的控制器看起来像:

class PostsController < ApplicationController
  before_action :set_post, only: [:show, :edit, :update, :destroy]

  # GET /posts
  # GET /posts.json
  def index
    @posts = Post.all
  end

  # GET /posts/1
  # GET /posts/1.json
  def show
    @post = Post.find(params[:id])
  end

  # GET /posts/new
  def new
    @post = Post.new
  end 

这是我的views / posts / index.html.erb文件

<%= react_component('PostList', {name: raw(render(template: 'posts/index', formats: :json)) }) %>

这里是views / posts / index.json.jbuilder文件

json.array!(@posts) do |post|
  json.extract! post, :id, :title, :body
  json.url post_url(post, format: :json)
end

这里是views / posts / show.json.jbuilder文件

json.extract! @post, :id, :title, :body, :created_at, :updated_at

这是我的反应组件文件assets / javascripts / components / post_list.js.jsx

var PostList = React.createClass({

  render: function() {  
    return (
      <div>
        {JSON.parse(this.props.posts).map(function(post) { 
          return <Post key={post.id} {... post}  />;
        })}
      </div>
      );
  }
});

所以我无法理解我哪里错了。我无法从json获取数据到index.html.erb。我怎样才能做到这一点?请帮助我卡住,我在互联网上找不到任何可以理解的东西

2 个答案:

答案 0 :(得分:0)

我做了三处修改让它发挥作用:

  1. index.html.erb

    <%= react_component('PostList',
              render(template: 'posts/index', formats: :json)
             )
     %>
    
  2. views / posts / index.json.jbuilder文件

    json.posts(@posts) do |post|
      json.extract! post, :id, :title, :body
      json.url post_url(post, format: :json)
    end
    

    按照documentation中的说明;即。 “确保你的JSON是一个字符串化的哈希,而不是一个数组”。

  3. 删除PostList组件渲染功能中的JSON.parse函数,对此:

    var PostList = React.createClass({
    
       render: function() {
          return (
             <div>
               {this.props.posts.map(function(post) {
                  return <Post key={post.id} {... post}  />;
                })}
             </div>
           );
       }
    });
    

答案 1 :(得分:0)

这种方法很有效。

<强> index.html.erb

<% @news.order("id DESC").each do |news|  %>
                <%= react_component('News', { :news => news }) %>
                <% end %>

<强> news.js.jsx

var News = React.createClass({

 displayName: 'News',

  render: function() {
    return (
           <div>
             <h4>{this.props.news.title}</h4>
             <p>{this.props.news.body}</p>
           </div>
    );
   }
 }); 

<强> index.json.jbuilder

json.array!(@news) do |news|
  json.extract! news, :id, :title, :body
  json.url news_url(news, format: :json)
end